{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:32:21.665406Z",
     "start_time": "2018-09-04T03:32:21.660911Z"
    }
   },
   "source": [
    "# **Application Programming Interface (API)**\n",
    "\n",
    "**API Definition**  \n",
    "> Application Program Interfaces, or APIs, are commonly used to retrieve data from remote websites.  \n",
    "> To use an API, you make a request to a remote web server, and retrieve the data you need.\n",
    "\n",
    "**Why use API?**\n",
    "> Quickly changing data. Eg - Stock Market Data.  \n",
    "> In case you want a small piece of a much larger dataset. Eg - Twitter.\n",
    "\n",
    "**Communication Protocols**\n",
    "> **FTP** - File Transfer Protocol  \n",
    "> **SFTP** - Secure File Transfer Protocol  \n",
    "> **SMTP** - Simple Mail Transfer Protocol  \n",
    "> **HTTP** - Hyper Text Transfer Protocol  \n",
    "> **HTTPS** - Secure HTTP  \n",
    "\n",
    "**HTTP Request Metods**\n",
    "> **POST** - `C`reate  \n",
    "> **GET** - `R`ead   \n",
    "> **PUT** - `U`pdate  \n",
    "> **DELETE** - `D`elete\n",
    "\n",
    "**API Request**\n",
    "> In order to get the data, we make a HTTP request to a webserver.  \n",
    "> The server then replies with our data.  \n",
    "> In Python, we'll use the **requests** module to do this.  \n",
    "> There are many different types of requests.   \n",
    "> The most commonly used one, a **GET request**, is used to retrieve data.  \n",
    "\n",
    "**Anatomy of a URL**  \n",
    "<img width=\"600\" height=\"400\" src='images/anatomy_url.PNG'>\n",
    "\n",
    "**How do you send a request to open Google home page?**  \n",
    "> **Step 1** - Open Browser  \n",
    "> **Step 2** - Type Google.com in the URL section  \n",
    "> **Step 3** - Hit `Enter`\n",
    "\n",
    "**How do you send a request to open Google home page in `Python`?**   \n",
    "```python\n",
    "# Code Syntax\n",
    "import requests\n",
    "URL = 'google.com'\n",
    "response = requests.get(URL)\n",
    "```\n",
    "\n",
    "**Response - Status Code**\n",
    "> **1xx** - Info  \n",
    "> **2xx** - Success  \n",
    "> **3xx** - Redirection  \n",
    "> **4xx** - Client Error  \n",
    "> **5xx** - Server Error"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Request and Response from Google Web Server**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:32:43.971470Z",
     "start_time": "2018-09-04T03:32:43.967795Z"
    }
   },
   "outputs": [],
   "source": [
    "# Importing the requests library\n",
    "\n",
    "import requests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:20.386628Z",
     "start_time": "2018-09-04T03:33:19.151218Z"
    }
   },
   "outputs": [],
   "source": [
    "# Make a \"get\" request to fetch search results on thataiguy\n",
    "\n",
    "response = requests.get(\"https://google.com/search?q=thataiguy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Content-Type': 'text/html; charset=ISO-8859-1', 'Date': 'Wed, 29 Nov 2023 09:04:28 GMT', 'Expires': '-1', 'Cache-Control': 'private, max-age=0', 'Content-Security-Policy': \"object-src 'none';base-uri 'self';script-src 'nonce-wI9lHcDhkcSA3mgah_qb6Q' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/xsrp\", 'P3P': 'CP=\"This is not a P3P policy! See g.co/p3phelp for more info.\"', 'Content-Encoding': 'gzip', 'Server': 'gws', 'X-XSS-Protection': '0', 'X-Frame-Options': 'SAMEORIGIN', 'Set-Cookie': '1P_JAR=2023-11-29-09; expires=Fri, 29-Dec-2023 09:04:28 GMT; path=/; domain=.google.com; Secure, AEC=Ackid1SWiQvu3FizgHCHppfjWCT8uo9Z8Ok5rEp_ZCIPchHchRQW0w0R_yc; expires=Mon, 27-May-2024 09:04:28 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax, NID=511=o5gsYtSOOogJ7WZ6PDJVX9OPMeAXcd4v1SYWcSdLHuBdrxTZZ4GA0tfQq_nKlF_5hlOPspiZ7QywB2Yh6jLd_e_x8YOja8M-dCp7ZFUFF2nygJfJ9wHGGzSrio4zq_zf4KpNmuMjbQZLagcsdYCJcniCxQMFDMAiiH1sle7HEe4; expires=Thu, 30-May-2024 09:04:28 GMT; path=/; domain=.google.com; HttpOnly', 'Alt-Svc': 'h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000', 'Transfer-Encoding': 'chunked'}\n"
     ]
    }
   ],
   "source": [
    "# Print the response header\n",
    "\n",
    "print(response.headers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "https://www.google.com/search?q=thataiguy\n"
     ]
    }
   ],
   "source": [
    "# Check the response URL\n",
    "\n",
    "print(response.url)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    }
   ],
   "source": [
    "# Check the status code of the response\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ISO-8859-1\n"
     ]
    }
   ],
   "source": [
    "# Check the response encoding\n",
    "\n",
    "print(response.encoding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "text/html; charset=ISO-8859-1\n"
     ]
    }
   ],
   "source": [
    "# Check the response content type\n",
    "\n",
    "print(response.headers['Content-Type'])\n",
    "\n",
    "# Using this way, we can find the Date, Expires and other header properties as well"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<!doctype html><html lang=\"en-IN\"><head><meta charset=\"UTF-8\"><meta content=\"/images/branding/google\n"
     ]
    }
   ],
   "source": [
    "# # Text Response Content\n",
    "# # This is useful if the response body contains text data\n",
    "\n",
    "print(response.text[0:100])\n",
    "\n",
    "# # Try the following.\n",
    "# print(response.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b'<!doctype html><html lang=\"en-IN\"><head><meta charset=\"UTF-8\"><meta content=\"/images/branding/google'\n"
     ]
    }
   ],
   "source": [
    "# # Binary Response Content\n",
    "# # This is useful if the response body contains non-text data\n",
    "\n",
    "print(response.content[:100])\n",
    "\n",
    "# # Try the following.\n",
    "# print(response.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "JSONDecodeError",
     "evalue": "Expecting value: line 1 column 1 (char 0)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mJSONDecodeError\u001b[0m                           Traceback (most recent call last)",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\requests\\models.py:971\u001b[0m, in \u001b[0;36mResponse.json\u001b[1;34m(self, **kwargs)\u001b[0m\n\u001b[0;32m    970\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 971\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m complexjson\u001b[38;5;241m.\u001b[39mloads(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtext, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m    972\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m JSONDecodeError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    973\u001b[0m     \u001b[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001b[39;00m\n\u001b[0;32m    974\u001b[0m     \u001b[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001b[39;00m\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\simplejson\\__init__.py:514\u001b[0m, in \u001b[0;36mloads\u001b[1;34m(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, use_decimal, allow_nan, **kw)\u001b[0m\n\u001b[0;32m    510\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m encoding \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m    511\u001b[0m         parse_int \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m parse_float \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m\n\u001b[0;32m    512\u001b[0m         parse_constant \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m object_pairs_hook \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m    513\u001b[0m         \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m use_decimal \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m allow_nan \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m kw):\n\u001b[1;32m--> 514\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_default_decoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    515\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\simplejson\\decoder.py:386\u001b[0m, in \u001b[0;36mJSONDecoder.decode\u001b[1;34m(self, s, _w, _PY3)\u001b[0m\n\u001b[0;32m    385\u001b[0m     s \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(s, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mencoding)\n\u001b[1;32m--> 386\u001b[0m obj, end \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraw_decode\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    387\u001b[0m end \u001b[38;5;241m=\u001b[39m _w(s, end)\u001b[38;5;241m.\u001b[39mend()\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\simplejson\\decoder.py:416\u001b[0m, in \u001b[0;36mJSONDecoder.raw_decode\u001b[1;34m(self, s, idx, _w, _PY3)\u001b[0m\n\u001b[0;32m    415\u001b[0m         idx \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m3\u001b[39m\n\u001b[1;32m--> 416\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mscan_once\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_w\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43midx\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mend\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[1;31mJSONDecodeError\u001b[0m: Expecting value: line 1 column 1 (char 0)",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mJSONDecodeError\u001b[0m                           Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[10], line 4\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;66;03m# # JSON Response Content\u001b[39;00m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;66;03m# # This is useful if the response body contains JSON data\u001b[39;00m\n\u001b[1;32m----> 4\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjson\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m      6\u001b[0m \u001b[38;5;66;03m# # Generates Error: Why?\u001b[39;00m\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\requests\\models.py:975\u001b[0m, in \u001b[0;36mResponse.json\u001b[1;34m(self, **kwargs)\u001b[0m\n\u001b[0;32m    971\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m complexjson\u001b[38;5;241m.\u001b[39mloads(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtext, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m    972\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m JSONDecodeError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m    973\u001b[0m     \u001b[38;5;66;03m# Catch JSON-related errors and raise as requests.JSONDecodeError\u001b[39;00m\n\u001b[0;32m    974\u001b[0m     \u001b[38;5;66;03m# This aliases json.JSONDecodeError and simplejson.JSONDecodeError\u001b[39;00m\n\u001b[1;32m--> 975\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m RequestsJSONDecodeError(e\u001b[38;5;241m.\u001b[39mmsg, e\u001b[38;5;241m.\u001b[39mdoc, e\u001b[38;5;241m.\u001b[39mpos)\n",
      "\u001b[1;31mJSONDecodeError\u001b[0m: Expecting value: line 1 column 1 (char 0)"
     ]
    }
   ],
   "source": [
    "# # JSON Response Content\n",
    "# # This is useful if the response body contains JSON data\n",
    "\n",
    "response.json()\n",
    "\n",
    "# # Generates Error: Why?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Status Code**\n",
    "\n",
    "Here are some codes that are relevant to GET requests:\n",
    "\n",
    "> **200** - everything went okay, and the result has been returned (if any).  \n",
    "> **301** - the server is redirecting you to a different endpoint. This can happen when a company switches domain names, or an endpoint name is changed.  \n",
    "> **401** - the server thinks you're not authenticated. This happens when you don't send the right credentials to access an API (we'll talk about authentication in a later post).  \n",
    "> **400** - the server thinks you made a bad request. This can happen when you don't send along the right data, among other things.  \n",
    "> **403** - the resource you're trying to access is forbidden -- you don't have the right permissions to see it.  \n",
    "> **404** - the resource you tried to access wasn't found on the server.\n",
    "\n",
    "**Remember**\n",
    "\n",
    "> **1xx** - Information  \n",
    "> **2xx** - Success  \n",
    "> **3xx** - Redirection  \n",
    "> **4xx** - Client Error  \n",
    "> **5xx** - Server Error  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "404\n"
     ]
    }
   ],
   "source": [
    "# Try the endpoint that doesnot exist\n",
    "\n",
    "response = requests.get(\"https://google.com/abcd\")\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    }
   ],
   "source": [
    "# Lets now try again with a endpoint that exists\n",
    "\n",
    "response = requests.get(\"https://google.com/search\")\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Query Parameters**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "# Request without query parameter\n",
    "response = requests.get(\"https://google.com/search\")\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    }
   ],
   "source": [
    "parameters = {\"q\": \"Kanav Bansal\"}\n",
    "\n",
    "# Request with query parameter\n",
    "response = requests.get(\"https://google.com/search\", params=parameters)\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Request and Response from International Space Station API**\n",
    "\n",
    "**Demonstrating an example with OpenNotify API**  \n",
    "In order to demonstrate, we will be using OpenNotify's API. OpenNotify has several API endpoints.  \n",
    "**OpenNotify API Documentation -** http://open-notify.org/Open-Notify-API/\n",
    "\n",
    "**API Endpoint**\n",
    "> An API endpoint is a digital location where an API receives requests about a specific resource on its server. \n",
    "\n",
    "**`/iss-now.json` endpoint**\n",
    "> The first endpoint we'll look at on OpenNotify is the iss-now.json endpoint.  \n",
    "> This endpoint gets the current latitude and longitude of the International Space Station.   \n",
    "> As you can see, retrieving this data isn't a great fit for a dataset, because it involves some calculation on the server, and changes quickly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:32:43.971470Z",
     "start_time": "2018-09-04T03:32:43.967795Z"
    }
   },
   "outputs": [],
   "source": [
    "# Import \"requests\" library\n",
    "\n",
    "import requests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:20.386628Z",
     "start_time": "2018-09-04T03:33:19.151218Z"
    }
   },
   "outputs": [],
   "source": [
    "# Make a get request to get the latest position of \n",
    "# the international space station from the opennotify api.\n",
    "\n",
    "response = requests.get(\"http://api.open-notify.org/iss-now.json\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Server': 'nginx/1.10.3', 'Date': 'Wed, 29 Nov 2023 09:13:18 GMT', 'Content-Type': 'application/json', 'Content-Length': '112', 'Connection': 'keep-alive', 'access-control-allow-origin': '*'}\n"
     ]
    }
   ],
   "source": [
    "print(response.headers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "application/json\n"
     ]
    }
   ],
   "source": [
    "# Check the response content type\n",
    "\n",
    "print(response.headers['Content-Type'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://api.open-notify.org/iss-now.json\n"
     ]
    }
   ],
   "source": [
    "# Check the response URL\n",
    "\n",
    "print(response.url)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    }
   ],
   "source": [
    "# Check the status code of the response\n",
    "\n",
    "print(response.status_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "utf-8\n"
     ]
    }
   ],
   "source": [
    "# Check the response encoding\n",
    "\n",
    "print(response.encoding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"timestamp\": 1701249198, \"iss_position\": {\"latitude\": \"10.5448\", \"longitude\": \"32.4625\"}, \"message\": \"success\"}\n"
     ]
    }
   ],
   "source": [
    "# Text Response Content\n",
    "# This is useful if the response body contains text data\n",
    "\n",
    "print(response.text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b'{\"timestamp\": 1701249198, \"iss_position\": {\"latitude\": \"10.5448\", \"longitude\": \"32.4625\"}, \"message\": \"success\"}'\n"
     ]
    }
   ],
   "source": [
    "# Binary Response Content\n",
    "# This is useful if the response body contains non-text data\n",
    "\n",
    "print(response.content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'timestamp': 1701249198, 'iss_position': {'latitude': '10.5448', 'longitude': '32.4625'}, 'message': 'success'}\n"
     ]
    }
   ],
   "source": [
    "# JSON Response Content\n",
    "# This is useful if the response body contains JSON data\n",
    "\n",
    "print(response.json())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Are there people in Space Right Now ?\n",
    "\n",
    "**`/astros.json` endpoint**\n",
    "> This API returns the current number of people in space.  \n",
    "> When known it also returns the names and spacecraft those people are on.   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:37.345919Z",
     "start_time": "2018-09-04T03:33:36.305704Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "application/json\n"
     ]
    }
   ],
   "source": [
    "response = requests.get(\"http://api.open-notify.org/astros.json\")\n",
    "\n",
    "print(response.headers[\"Content-Type\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:39.276426Z",
     "start_time": "2018-09-04T03:33:39.271722Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Server': 'nginx/1.10.3', 'Date': 'Wed, 29 Nov 2023 09:13:46 GMT', 'Content-Type': 'application/json', 'Content-Length': '360', 'Connection': 'keep-alive', 'access-control-allow-origin': '*'}\n"
     ]
    }
   ],
   "source": [
    "print(response.headers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:37.345919Z",
     "start_time": "2018-09-04T03:33:36.305704Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'dict'>\n"
     ]
    }
   ],
   "source": [
    "# Get the response data as a python object. Verify that it's a dictionary.\n",
    "data = response.json()\n",
    "\n",
    "print(type(data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-03T14:13:18.358948Z",
     "start_time": "2018-09-03T14:13:18.351933Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'message': 'success', 'people': [{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}, {'name': 'Andreas Mogensen', 'craft': 'ISS'}, {'name': 'Satoshi Furukawa', 'craft': 'ISS'}, {'name': 'Konstantin Borisov', 'craft': 'ISS'}, {'name': 'Oleg Kononenko', 'craft': 'ISS'}, {'name': 'Nikolai Chub', 'craft': 'ISS'}, {'name': \"Loral O'Hara\", 'craft': 'ISS'}], 'number': 7}\n"
     ]
    }
   ],
   "source": [
    "print(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finding the Number and Names of Astronauts in Space"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['message', 'people', 'number'])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n"
     ]
    }
   ],
   "source": [
    "# How many people are currently is space?\n",
    "print(data[\"number\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}, {'name': 'Andreas Mogensen', 'craft': 'ISS'}, {'name': 'Satoshi Furukawa', 'craft': 'ISS'}, {'name': 'Konstantin Borisov', 'craft': 'ISS'}, {'name': 'Oleg Kononenko', 'craft': 'ISS'}, {'name': 'Nikolai Chub', 'craft': 'ISS'}, {'name': \"Loral O'Hara\", 'craft': 'ISS'}]\n"
     ]
    }
   ],
   "source": [
    "# Who are these people?\n",
    "print(data[\"people\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jasmin Moghbeli\n",
      "Andreas Mogensen\n",
      "Satoshi Furukawa\n",
      "Konstantin Borisov\n",
      "Oleg Kononenko\n",
      "Nikolai Chub\n",
      "Loral O'Hara\n"
     ]
    }
   ],
   "source": [
    "people_in_space = data[\"people\"]\n",
    "\n",
    "for astronaut in people_in_space:\n",
    "    print(astronaut['name'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Converting the JSON data from API to DataFrame\n",
    "\n",
    "**Purpose**  \n",
    "Many APIs return data in JSON format, and the data might be nested. We must know how to convert JSON into a DataFrame that can be easily analyzed.\n",
    "\n",
    "**Steps**  \n",
    "1. Use the `requests` library to make HTTP requests to the API endpoint and retrieve the data. The API key, if required, needs to be included in the request headers.\n",
    "2. Once you have the data, you can push it in a `pandas` DataFrame to analyze and process it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Way 1**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>message</th>\n",
       "      <th>people</th>\n",
       "      <th>number</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Andreas Mogensen', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Satoshi Furukawa', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Konstantin Borisov', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Oleg Kononenko', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Nikolai Chub', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Loral O'Hara', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   message                                          people  number\n",
       "0  success     {'name': 'Jasmin Moghbeli', 'craft': 'ISS'}       7\n",
       "1  success    {'name': 'Andreas Mogensen', 'craft': 'ISS'}       7\n",
       "2  success    {'name': 'Satoshi Furukawa', 'craft': 'ISS'}       7\n",
       "3  success  {'name': 'Konstantin Borisov', 'craft': 'ISS'}       7\n",
       "4  success      {'name': 'Oleg Kononenko', 'craft': 'ISS'}       7\n",
       "5  success        {'name': 'Nikolai Chub', 'craft': 'ISS'}       7\n",
       "6  success        {'name': 'Loral O'Hara', 'craft': 'ISS'}       7"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Way 1\n",
    "\n",
    "# Using \"requests\" library make a HTTP request to \"/astros.json\" endpoint\n",
    "response = requests.get(\"http://api.open-notify.org/astros.json\")\n",
    "\n",
    "# Retrieve the data from the \"response\"\n",
    "data = response.json()\n",
    "\n",
    "# Push data to dataframe\n",
    "df = pd.DataFrame(data)\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>craft</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jasmin Moghbeli</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Andreas Mogensen</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Satoshi Furukawa</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Konstantin Borisov</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Oleg Kononenko</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Nikolai Chub</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Loral O'Hara</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 name craft\n",
       "0     Jasmin Moghbeli   ISS\n",
       "1    Andreas Mogensen   ISS\n",
       "2    Satoshi Furukawa   ISS\n",
       "3  Konstantin Borisov   ISS\n",
       "4      Oleg Kononenko   ISS\n",
       "5        Nikolai Chub   ISS\n",
       "6        Loral O'Hara   ISS"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# We don't need message and number column. We want two columns with Person Name and Craft. \n",
    "# Fixing way 1\n",
    "\n",
    "astronauts = pd.DataFrame(data['people'])\n",
    "\n",
    "astronauts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Way 2 - Using pd.json_normalize()**\n",
    "\n",
    "The json_normalize function in Pandas is used to normalize semi-structured JSON data into a flat table. It is particularly useful when dealing with nested JSON structures, where certain fields might contain nested dictionaries or lists."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>message</th>\n",
       "      <th>people</th>\n",
       "      <th>number</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>success</td>\n",
       "      <td>[{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}, ...</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   message                                             people  number\n",
       "0  success  [{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}, ...       7"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Way 2\n",
    "\n",
    "# Using \"requests\" library make a HTTP request to \"/astros.json\" endpoint\n",
    "response = requests.get(\"http://api.open-notify.org/astros.json\")\n",
    "\n",
    "# Retrieve the data from the \"response\"\n",
    "data = response.json()\n",
    "\n",
    "# Use \"json_normalize()\" to normalize JSON data into flat table\n",
    "df = pd.json_normalize(data)\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>craft</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jasmin Moghbeli</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Andreas Mogensen</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Satoshi Furukawa</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Konstantin Borisov</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Oleg Kononenko</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Nikolai Chub</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Loral O'Hara</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 name craft\n",
       "0     Jasmin Moghbeli   ISS\n",
       "1    Andreas Mogensen   ISS\n",
       "2    Satoshi Furukawa   ISS\n",
       "3  Konstantin Borisov   ISS\n",
       "4      Oleg Kononenko   ISS\n",
       "5        Nikolai Chub   ISS\n",
       "6        Loral O'Hara   ISS"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # This is not the expected outcome\n",
    "# # Fixing way 2\n",
    "\n",
    "# Using \"requests\" library make a HTTP request to \"/astros.json\" endpoint\n",
    "response = requests.get(\"http://api.open-notify.org/astros.json\")\n",
    "\n",
    "# Retrieve the data from the \"response\"\n",
    "data = response.json()\n",
    "\n",
    "# Convert JSON data to DataFrame\n",
    "astronauts = pd.json_normalize(data, record_path=['people'])\n",
    "\n",
    "astronauts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Way 3**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>message</th>\n",
       "      <th>people</th>\n",
       "      <th>number</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Andreas Mogensen', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Satoshi Furukawa', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Konstantin Borisov', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Oleg Kononenko', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Nikolai Chub', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>success</td>\n",
       "      <td>{'name': 'Loral O'Hara', 'craft': 'ISS'}</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   message                                          people  number\n",
       "0  success     {'name': 'Jasmin Moghbeli', 'craft': 'ISS'}       7\n",
       "1  success    {'name': 'Andreas Mogensen', 'craft': 'ISS'}       7\n",
       "2  success    {'name': 'Satoshi Furukawa', 'craft': 'ISS'}       7\n",
       "3  success  {'name': 'Konstantin Borisov', 'craft': 'ISS'}       7\n",
       "4  success      {'name': 'Oleg Kononenko', 'craft': 'ISS'}       7\n",
       "5  success        {'name': 'Nikolai Chub', 'craft': 'ISS'}       7\n",
       "6  success        {'name': 'Loral O'Hara', 'craft': 'ISS'}       7"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Way 3\n",
    "\n",
    "df = pd.read_json(\"http://api.open-notify.org/astros.json\")\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>craft</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jasmin Moghbeli</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Andreas Mogensen</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Satoshi Furukawa</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Konstantin Borisov</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Oleg Kononenko</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Nikolai Chub</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Loral O'Hara</td>\n",
       "      <td>ISS</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 name craft\n",
       "0     Jasmin Moghbeli   ISS\n",
       "1    Andreas Mogensen   ISS\n",
       "2    Satoshi Furukawa   ISS\n",
       "3  Konstantin Borisov   ISS\n",
       "4      Oleg Kononenko   ISS\n",
       "5        Nikolai Chub   ISS\n",
       "6        Loral O'Hara   ISS"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# We don't need message and number column. We want two columns with Person Name and Craft. \n",
    "# Fixing way 3\n",
    "\n",
    "# Convert JSON data to DataFrame\n",
    "astronauts = pd.json_normalize(df['people'])\n",
    "\n",
    "astronauts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Working with JSON** \n",
    "- Converting Python Objects to JSON and vice versa using **dumps() and loads()**\n",
    "- Saving the data to JSON files and vice versa using **dump() and load()**\n",
    "\n",
    "\n",
    "### **dumps() and loads()**\n",
    "We can convert lists, tuples and dictionaries to JSON strings, and convert JSON strings to lists and dictionaries.\n",
    "\n",
    "The json module has two main methods for doing this:\n",
    "> **json.dumps(PYTHON_OBJECT) -** Takes in a Python object, and converts it to a JSON string.  \n",
    "> **json.loads(JSON_STRING) -** Takes a JSON string, and converts it to a Python object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:33.902009Z",
     "start_time": "2018-09-04T03:33:33.894499Z"
    }
   },
   "outputs": [],
   "source": [
    "# Import the json library\n",
    "\n",
    "import json"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **dumps() & loads() on Python List**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:33.902009Z",
     "start_time": "2018-09-04T03:33:33.894499Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n",
      "['Shaktiman', 'Krish', 'Flying Jatt', 'Bhavesh Joshi']\n"
     ]
    }
   ],
   "source": [
    "# Make a list of Indian Superheros\n",
    "sup_hero = ['Shaktiman', 'Krish', 'Flying Jatt', 'Bhavesh Joshi']\n",
    "\n",
    "# Checking the type of \"sup_hero\"\n",
    "print(type(sup_hero)) \n",
    "\n",
    "print(sup_hero)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:33.902009Z",
     "start_time": "2018-09-04T03:33:33.894499Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'str'>\n",
      "[\"Shaktiman\", \"Krish\", \"Flying Jatt\", \"Bhavesh Joshi\"]\n"
     ]
    }
   ],
   "source": [
    "# Use json.dumps() to convert \"sup_hero\" to a string\n",
    "sup_hero_str = json.dumps(sup_hero)\n",
    "\n",
    "# Checking the type of \"sup_hero_str\"\n",
    "print(type(sup_hero_str))\n",
    "\n",
    "print(sup_hero_str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n",
      "['Shaktiman', 'Krish', 'Flying Jatt', 'Bhavesh Joshi']\n"
     ]
    }
   ],
   "source": [
    "# Convert best_food_chains_string back into a list\n",
    "sup_hero_lst = json.loads(sup_hero_str)\n",
    "\n",
    "print(type(sup_hero_lst))\n",
    "\n",
    "print(sup_hero_lst)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **dumps() & loads() on Python Dictionary**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-09-04T03:33:33.902009Z",
     "start_time": "2018-09-04T03:33:33.894499Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'dict'>\n",
      "{'Subway': 24722, 'McDonalds': 14098, 'Starbucks': 10821, 'Pizza Hut': 7600}\n"
     ]
    }
   ],
   "source": [
    "# Make a dictionary\n",
    "fast_food_franchise = {\n",
    "    \"Subway\": 24722,\n",
    "    \"McDonalds\": 14098,\n",
    "    \"Starbucks\": 10821,\n",
    "    \"Pizza Hut\": 7600\n",
    "}\n",
    "\n",
    "print(type(fast_food_franchise))\n",
    "\n",
    "print(fast_food_franchise)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'str'>\n",
      "{\"Subway\": 24722, \"McDonalds\": 14098, \"Starbucks\": 10821, \"Pizza Hut\": 7600}\n"
     ]
    }
   ],
   "source": [
    "# We can also dump a dictionary to a string and load it.\n",
    "fast_food_franchise_str = json.dumps(fast_food_franchise)\n",
    "\n",
    "print(type(fast_food_franchise_str))\n",
    "\n",
    "print(fast_food_franchise_str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'dict'>\n",
      "{'Subway': 24722, 'McDonalds': 14098, 'Starbucks': 10821, 'Pizza Hut': 7600}\n"
     ]
    }
   ],
   "source": [
    "fast_food_franchise_lst = json.loads(fast_food_franchise_str)\n",
    "\n",
    "print(type(fast_food_franchise_lst))\n",
    "\n",
    "print(fast_food_franchise_lst)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **dumps() & loads() on Python Tuple**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'tuple'>\n",
      "('Kanav', 'Bansal', 'Data Science')\n"
     ]
    }
   ],
   "source": [
    "tup = ('Kanav', \"Bansal\", \"Data Science\")\n",
    "\n",
    "print(type(tup))\n",
    "\n",
    "print(tup)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'str'>\n",
      "[\"Kanav\", \"Bansal\", \"Data Science\"]\n"
     ]
    }
   ],
   "source": [
    "tup_str = json.dumps(tup)\n",
    "\n",
    "print(type(tup_str))\n",
    "\n",
    "print(tup_str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n",
      "['Kanav', 'Bansal', 'Data Science']\n"
     ]
    }
   ],
   "source": [
    "tup_lst = json.loads(tup_str)\n",
    "\n",
    "print(type(tup_lst))\n",
    "\n",
    "print(tup_lst)\n",
    "# Remeber loads() function converts JSON string to Python String, List or Dictionary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **dump() and load()**\n",
    "\n",
    "We can create and read JSON files.\n",
    "\n",
    "The json module has two main methods for doing this:\n",
    "> **json.dump(data, file_object) -** This helps in writing data into a JSON file format.  \n",
    "> **json.load(file_object) -** This helps to read a JSON file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Subway': 24722, 'McDonalds': 14098, 'Starbucks': 10821, 'Pizza Hut': 7600}\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "source": [
    "print(fast_food_franchise)\n",
    "\n",
    "print(type(fast_food_franchise))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "file_name = 'data/fast_food.json'\n",
    "\n",
    "with open(file_name, 'w') as f:\n",
    "    json.dump(fast_food_franchise, f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Shaktiman', 'Krish', 'Flying Jatt', 'Bhavesh Joshi']\n",
      "<class 'list'>\n"
     ]
    }
   ],
   "source": [
    "print(sup_hero)\n",
    "\n",
    "print(type(sup_hero))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "file_name = 'data/sup_hero.json'\n",
    "\n",
    "with open(file_name, 'w') as f:\n",
    "    json.dump(sup_hero, f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Shaktiman', 'Krish', 'Flying Jatt', 'Bhavesh Joshi']\n",
      "<class 'list'>\n"
     ]
    }
   ],
   "source": [
    "file_name = 'data/sup_hero.json'\n",
    "\n",
    "with open(file_name, 'r') as f:\n",
    "    data = json.load(f)\n",
    "    \n",
    "print(data)\n",
    "print(type(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Popular API Documentations**\n",
    "\n",
    "**fakestoreapi**  \n",
    "> https://fakestoreapi.com/docs  \n",
    "> fakeStoreApi can be used with any type of shopping project that needs products, carts, and users in JSON format. You can use examples below to check how fakeStoreApi works and feel free to enjoy it in your awesome projects! \n",
    "\n",
    "**coingecko**  \n",
    "> https://www.coingecko.com/en/api/documentation  \n",
    "> CoinGecko was founded in 2014 with the mission to democratize the access of crypto data and empower users with actionable insights. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Extracting Crypto Data using Coingecko API**\n",
    "\n",
    "**ROOT_URL = \"https://api.coingecko.com/api/v3\"**\n",
    "\n",
    "**API End Points**\n",
    "> **Ping** - `/ping`  \n",
    "> **Coin List** - `/coin/list`  \n",
    "> **Coin Market** - `/coins/markets`  \n",
    "> **Coin History** - `/coins/{id}/history`  \n",
    "> **Coin Market Chart** - `coins/{id}/market_chart`  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **Endpoint - `/ping`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "200"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "ROOT_URL = \"https://api.coingecko.com/api/v3\"\n",
    "endpoint = \"/ping\"\n",
    "\n",
    "res = requests.get(ROOT_URL + endpoint)\n",
    "\n",
    "res.status_code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Date': 'Wed, 29 Nov 2023 09:42:59 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'X-Content-Type-Options': 'nosniff', 'X-Download-Options': 'noopen', 'X-Permitted-Cross-Domain-Policies': 'none', 'Referrer-Policy': 'strict-origin-when-cross-origin', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, PUT, DELETE, GET, OPTIONS', 'Access-Control-Request-Method': '*', 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization', 'Access-Control-Expose-Headers': 'link, per-page, total', 'Vary': 'Accept-Encoding, Origin', 'Content-Encoding': 'gzip', 'ETag': 'W/\"166aff44678203974a27914c182f2f81\"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'X-Request-Id': '2cfdcf1b-2160-4387-9a05-4a993a146ab6', 'X-Runtime': '0.002496', 'Alternate-Protocol': '443:npn-spdy/2', 'Strict-Transport-Security': 'max-age=15724800; includeSubdomains', 'CF-Cache-Status': 'MISS', 'Set-Cookie': '__cf_bm=hYmb16ifnhDlJs233iHQ8.XtUrqPyFr_bhTaFG1yHLM-1701250979-0-AcvfpfV/bsuALK8hoE5q5PQcSoe6P6YUlyeU/AWAIGBiCJ2aUracFIk/8+8RFz/gKbePmv+XoujWPLy9GFx97NE=; path=/; expires=Wed, 29-Nov-23 10:12:59 GMT; domain=.api.coingecko.com; HttpOnly; Secure; SameSite=None', 'Server': 'cloudflare', 'CF-RAY': '82d9e75e99292e8b-HYD'}"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.headers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'application/json; charset=utf-8'"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.headers['Content-Type']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'{\"gecko_says\":\"(V3) To the Moon!\"}'"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.text"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **Endpoint - `/coin/list`**\n",
    "Use this to obtain all the coins' id in order to make API calls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'id': '01coin', 'symbol': 'zoc', 'name': '01coin'},\n",
       " {'id': '0chain', 'symbol': 'zcn', 'name': 'Zus'},\n",
       " {'id': '0-knowledge-network', 'symbol': '0kn', 'name': '0 Knowledge Network'},\n",
       " {'id': '0-mee', 'symbol': 'ome', 'name': 'O-MEE'},\n",
       " {'id': '0vix-protocol', 'symbol': 'vix', 'name': '0VIX Protocol'}]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "ROOT_URL = \"https://api.coingecko.com/api/v3\"\n",
    "endpoint = \"/coins/list\"\n",
    "\n",
    "res = requests.get(ROOT_URL + endpoint)\n",
    "\n",
    "res.json()[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n"
     ]
    }
   ],
   "source": [
    "data = res.json()\n",
    "\n",
    "print(type(data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>symbol</th>\n",
       "      <th>name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>01coin</td>\n",
       "      <td>zoc</td>\n",
       "      <td>01coin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0chain</td>\n",
       "      <td>zcn</td>\n",
       "      <td>Zus</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0-knowledge-network</td>\n",
       "      <td>0kn</td>\n",
       "      <td>0 Knowledge Network</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0-mee</td>\n",
       "      <td>ome</td>\n",
       "      <td>O-MEE</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0vix-protocol</td>\n",
       "      <td>vix</td>\n",
       "      <td>0VIX Protocol</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    id symbol                 name\n",
       "0               01coin    zoc               01coin\n",
       "1               0chain    zcn                  Zus\n",
       "2  0-knowledge-network    0kn  0 Knowledge Network\n",
       "3                0-mee    ome                O-MEE\n",
       "4        0vix-protocol    vix        0VIX Protocol"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_json(ROOT_URL + endpoint)\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(11150, 3)"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>symbol</th>\n",
       "      <th>name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1263</th>\n",
       "      <td>binance-peg-dogecoin</td>\n",
       "      <td>doge</td>\n",
       "      <td>Binance-Peg Dogecoin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1314</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1641</th>\n",
       "      <td>bridged-binance-peg-ethereum-opbnb</td>\n",
       "      <td>eth</td>\n",
       "      <td>Bridged Binance-Peg Ethereum (opBNB)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1695</th>\n",
       "      <td>bridged-wrapped-ether-starkgate</td>\n",
       "      <td>eth</td>\n",
       "      <td>Bridged Ether (StarkGate)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2995</th>\n",
       "      <td>dogecoin</td>\n",
       "      <td>doge</td>\n",
       "      <td>Dogecoin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3022</th>\n",
       "      <td>doge-on-pulsechain</td>\n",
       "      <td>doge</td>\n",
       "      <td>Doge on Pulsechain</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3466</th>\n",
       "      <td>ethereum</td>\n",
       "      <td>eth</td>\n",
       "      <td>Ethereum</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3480</th>\n",
       "      <td>ethereum-wormhole</td>\n",
       "      <td>eth</td>\n",
       "      <td>Ethereum (Wormhole)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                      id symbol  \\\n",
       "1263                binance-peg-dogecoin   doge   \n",
       "1314                             bitcoin    btc   \n",
       "1641  bridged-binance-peg-ethereum-opbnb    eth   \n",
       "1695     bridged-wrapped-ether-starkgate    eth   \n",
       "2995                            dogecoin   doge   \n",
       "3022                  doge-on-pulsechain   doge   \n",
       "3466                            ethereum    eth   \n",
       "3480                   ethereum-wormhole    eth   \n",
       "\n",
       "                                      name  \n",
       "1263                  Binance-Peg Dogecoin  \n",
       "1314                               Bitcoin  \n",
       "1641  Bridged Binance-Peg Ethereum (opBNB)  \n",
       "1695             Bridged Ether (StarkGate)  \n",
       "2995                              Dogecoin  \n",
       "3022                    Doge on Pulsechain  \n",
       "3466                              Ethereum  \n",
       "3480                   Ethereum (Wormhole)  "
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[ (df.symbol == 'btc') | (df.symbol == 'eth') | (df.symbol == 'doge') ]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **Endpoint - `/coins/markets`**\n",
    "Use this to obtain all the coins market data (price, market cap, volume)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "200"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "ROOT_URL = \"https://api.coingecko.com/api/v3\"\n",
    "endpoint = \"/coins/markets\"\n",
    "\n",
    "payload = {'vs_currency': 'usd', 'ids': 'bitcoin, dogecoin, ethereum'}\n",
    "\n",
    "res = requests.get(ROOT_URL + endpoint, params=payload)\n",
    "\n",
    "res.status_code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'id': 'bitcoin',\n",
       "  'symbol': 'btc',\n",
       "  'name': 'Bitcoin',\n",
       "  'image': 'https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1696501400',\n",
       "  'current_price': 38211,\n",
       "  'market_cap': 747831582140,\n",
       "  'market_cap_rank': 1,\n",
       "  'fully_diluted_valuation': 803047318461,\n",
       "  'total_volume': 21708790322,\n",
       "  'high_24h': 38351,\n",
       "  'low_24h': 37009,\n",
       "  'price_change_24h': 1093.41,\n",
       "  'price_change_percentage_24h': 2.94575,\n",
       "  'market_cap_change_24h': 22522029977,\n",
       "  'market_cap_change_percentage_24h': 3.10516,\n",
       "  'circulating_supply': 19556087.0,\n",
       "  'total_supply': 21000000.0,\n",
       "  'max_supply': 21000000.0,\n",
       "  'ath': 69045,\n",
       "  'ath_change_percentage': -44.61138,\n",
       "  'ath_date': '2021-11-10T14:24:11.849Z',\n",
       "  'atl': 67.81,\n",
       "  'atl_change_percentage': 56298.04128,\n",
       "  'atl_date': '2013-07-06T00:00:00.000Z',\n",
       "  'roi': None,\n",
       "  'last_updated': '2023-11-29T09:44:59.143Z'},\n",
       " {'id': 'ethereum',\n",
       "  'symbol': 'eth',\n",
       "  'name': 'Ethereum',\n",
       "  'image': 'https://assets.coingecko.com/coins/images/279/large/ethereum.png?1696501628',\n",
       "  'current_price': 2067.15,\n",
       "  'market_cap': 248755184776,\n",
       "  'market_cap_rank': 2,\n",
       "  'fully_diluted_valuation': 248755184776,\n",
       "  'total_volume': 16271509088,\n",
       "  'high_24h': 2076.14,\n",
       "  'low_24h': 2013.81,\n",
       "  'price_change_24h': 47.84,\n",
       "  'price_change_percentage_24h': 2.3689,\n",
       "  'market_cap_change_24h': 6050263144,\n",
       "  'market_cap_change_percentage_24h': 2.49285,\n",
       "  'circulating_supply': 120239567.48433,\n",
       "  'total_supply': 120239567.48433,\n",
       "  'max_supply': None,\n",
       "  'ath': 4878.26,\n",
       "  'ath_change_percentage': -57.5858,\n",
       "  'ath_date': '2021-11-10T14:24:19.604Z',\n",
       "  'atl': 0.432979,\n",
       "  'atl_change_percentage': 477769.79756,\n",
       "  'atl_date': '2015-10-20T00:00:00.000Z',\n",
       "  'roi': {'times': 71.30987070504497,\n",
       "   'currency': 'btc',\n",
       "   'percentage': 7130.987070504498},\n",
       "  'last_updated': '2023-11-29T09:44:53.942Z'},\n",
       " {'id': 'dogecoin',\n",
       "  'symbol': 'doge',\n",
       "  'name': 'Dogecoin',\n",
       "  'image': 'https://assets.coingecko.com/coins/images/5/large/dogecoin.png?1696501409',\n",
       "  'current_price': 0.080588,\n",
       "  'market_cap': 11459539420,\n",
       "  'market_cap_rank': 10,\n",
       "  'fully_diluted_valuation': 11459406288,\n",
       "  'total_volume': 847316169,\n",
       "  'high_24h': 0.081197,\n",
       "  'low_24h': 0.077216,\n",
       "  'price_change_24h': 0.00317619,\n",
       "  'price_change_percentage_24h': 4.103,\n",
       "  'market_cap_change_24h': 475259562,\n",
       "  'market_cap_change_percentage_24h': 4.32672,\n",
       "  'circulating_supply': 142026716383.705,\n",
       "  'total_supply': 142025066383.705,\n",
       "  'max_supply': None,\n",
       "  'ath': 0.731578,\n",
       "  'ath_change_percentage': -88.97087,\n",
       "  'ath_date': '2021-05-08T05:08:23.458Z',\n",
       "  'atl': 8.69e-05,\n",
       "  'atl_change_percentage': 92746.05788,\n",
       "  'atl_date': '2015-05-06T00:00:00.000Z',\n",
       "  'roi': None,\n",
       "  'last_updated': '2023-11-29T09:44:54.919Z'}]"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>symbol</th>\n",
       "      <th>name</th>\n",
       "      <th>image</th>\n",
       "      <th>current_price</th>\n",
       "      <th>market_cap</th>\n",
       "      <th>market_cap_rank</th>\n",
       "      <th>fully_diluted_valuation</th>\n",
       "      <th>total_volume</th>\n",
       "      <th>high_24h</th>\n",
       "      <th>...</th>\n",
       "      <th>ath_change_percentage</th>\n",
       "      <th>ath_date</th>\n",
       "      <th>atl</th>\n",
       "      <th>atl_change_percentage</th>\n",
       "      <th>atl_date</th>\n",
       "      <th>roi</th>\n",
       "      <th>last_updated</th>\n",
       "      <th>roi.times</th>\n",
       "      <th>roi.currency</th>\n",
       "      <th>roi.percentage</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>https://assets.coingecko.com/coins/images/1/la...</td>\n",
       "      <td>38211.000000</td>\n",
       "      <td>747831582140</td>\n",
       "      <td>1</td>\n",
       "      <td>803047318461</td>\n",
       "      <td>21708790322</td>\n",
       "      <td>38351.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>-44.61138</td>\n",
       "      <td>2021-11-10T14:24:11.849Z</td>\n",
       "      <td>67.810000</td>\n",
       "      <td>56298.04128</td>\n",
       "      <td>2013-07-06T00:00:00.000Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2023-11-29T09:44:59.143Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ethereum</td>\n",
       "      <td>eth</td>\n",
       "      <td>Ethereum</td>\n",
       "      <td>https://assets.coingecko.com/coins/images/279/...</td>\n",
       "      <td>2067.150000</td>\n",
       "      <td>248755184776</td>\n",
       "      <td>2</td>\n",
       "      <td>248755184776</td>\n",
       "      <td>16271509088</td>\n",
       "      <td>2076.140000</td>\n",
       "      <td>...</td>\n",
       "      <td>-57.58580</td>\n",
       "      <td>2021-11-10T14:24:19.604Z</td>\n",
       "      <td>0.432979</td>\n",
       "      <td>477769.79756</td>\n",
       "      <td>2015-10-20T00:00:00.000Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2023-11-29T09:44:53.942Z</td>\n",
       "      <td>71.309871</td>\n",
       "      <td>btc</td>\n",
       "      <td>7130.987071</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>dogecoin</td>\n",
       "      <td>doge</td>\n",
       "      <td>Dogecoin</td>\n",
       "      <td>https://assets.coingecko.com/coins/images/5/la...</td>\n",
       "      <td>0.080588</td>\n",
       "      <td>11459539420</td>\n",
       "      <td>10</td>\n",
       "      <td>11459406288</td>\n",
       "      <td>847316169</td>\n",
       "      <td>0.081197</td>\n",
       "      <td>...</td>\n",
       "      <td>-88.97087</td>\n",
       "      <td>2021-05-08T05:08:23.458Z</td>\n",
       "      <td>0.000087</td>\n",
       "      <td>92746.05788</td>\n",
       "      <td>2015-05-06T00:00:00.000Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2023-11-29T09:44:54.919Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 29 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         id symbol      name  \\\n",
       "0   bitcoin    btc   Bitcoin   \n",
       "1  ethereum    eth  Ethereum   \n",
       "2  dogecoin   doge  Dogecoin   \n",
       "\n",
       "                                               image  current_price  \\\n",
       "0  https://assets.coingecko.com/coins/images/1/la...   38211.000000   \n",
       "1  https://assets.coingecko.com/coins/images/279/...    2067.150000   \n",
       "2  https://assets.coingecko.com/coins/images/5/la...       0.080588   \n",
       "\n",
       "     market_cap  market_cap_rank  fully_diluted_valuation  total_volume  \\\n",
       "0  747831582140                1             803047318461   21708790322   \n",
       "1  248755184776                2             248755184776   16271509088   \n",
       "2   11459539420               10              11459406288     847316169   \n",
       "\n",
       "       high_24h  ...  ath_change_percentage                  ath_date  \\\n",
       "0  38351.000000  ...              -44.61138  2021-11-10T14:24:11.849Z   \n",
       "1   2076.140000  ...              -57.58580  2021-11-10T14:24:19.604Z   \n",
       "2      0.081197  ...              -88.97087  2021-05-08T05:08:23.458Z   \n",
       "\n",
       "         atl  atl_change_percentage                  atl_date  roi  \\\n",
       "0  67.810000            56298.04128  2013-07-06T00:00:00.000Z  NaN   \n",
       "1   0.432979           477769.79756  2015-10-20T00:00:00.000Z  NaN   \n",
       "2   0.000087            92746.05788  2015-05-06T00:00:00.000Z  NaN   \n",
       "\n",
       "               last_updated  roi.times  roi.currency  roi.percentage  \n",
       "0  2023-11-29T09:44:59.143Z        NaN           NaN             NaN  \n",
       "1  2023-11-29T09:44:53.942Z  71.309871           btc     7130.987071  \n",
       "2  2023-11-29T09:44:54.919Z        NaN           NaN             NaN  \n",
       "\n",
       "[3 rows x 29 columns]"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.json_normalize(res.json())\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **Endpoint - `/coins/{id}/history`**\n",
    "Get historical data (name, price, market, stats) at a given date for a coin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Today's date: 29-11-2023\n"
     ]
    }
   ],
   "source": [
    "from datetime import date\n",
    "\n",
    "today = date.today().strftime(\"%d-%m-%Y\")\n",
    "\n",
    "print(\"Today's date:\", today)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "200"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "uid = \"bitcoin\"\n",
    "\n",
    "ROOT_URL = \"https://api.coingecko.com/api/v3\"\n",
    "endpoint = f\"/coins/{uid}/history\"\n",
    "payload = {'date': today}\n",
    "\n",
    "res = requests.get(ROOT_URL + endpoint, params=payload)\n",
    "\n",
    "res.status_code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'id': 'bitcoin', 'symbol': 'btc', 'name': 'Bitcoin', 'localization': {'en': 'Bitcoin', 'de': 'Bitcoin', 'es': 'Bitcoin', 'fr': 'Bitcoin', 'it': 'Bitcoin', 'pl': 'Bitcoin', 'ro': 'Bitcoin', 'hu': 'Bitcoin', 'nl': 'Bitcoin', 'pt': 'Bitcoin', 'sv': 'Bitcoin', 'vi': 'Bitcoin', 'tr': 'Bitcoin', 'ru': 'Биткоин', 'ja': 'ビットコイン', 'zh': '比特币', 'zh-tw': '比特幣', 'ko': '비트코인', 'ar': 'بيتكوين', 'th': 'บิตคอยน์', 'id': 'Bitcoin', 'cs': 'Bitcoin', 'da': 'Bitcoin', 'el': 'Bitcoin', 'hi': 'Bitcoin', 'no': 'Bitcoin', 'sk': 'Bitcoin', 'uk': 'Bitcoin', 'he': 'Bitcoin', 'fi': 'Bitcoin', 'bg': 'Bitcoin', 'hr': 'Bitcoin', 'lt': 'Bitcoin', 'sl': 'Bitcoin'}, 'image': {'thumb': 'https://assets.coingecko.com/coins/images/1/thumb/bitcoin.png?1696501400', 'small': 'https://assets.coingecko.com/coins/images/1/small/bitcoin.png?1696501400'}, 'market_data': {'current_price': {'aed': 138824.93164715782, 'ars': 13590875.375203328, 'aud': 56799.787569809756, 'bch': 169.4958115430225, 'bdt': 4164657.9422907243, 'bhd': 14245.659246388388, 'bmd': 37802.23604377473, 'bnb': 164.69361654481813, 'brl': 184142.25221643565, 'btc': 1.0, 'cad': 51291.963975995684, 'chf': 33163.901681203504, 'clp': 32871509.588490177, 'cny': 267405.45732645324, 'czk': 833180.1835228162, 'dkk': 256151.73165622173, 'dot': 7179.161430979812, 'eos': 55819.37556721214, 'eth': 18.45329501369106, 'eur': 34360.68267211343, 'gbp': 29743.78217737911, 'hkd': 294660.4914916543, 'huf': 12966166.963014709, 'idr': 580343707.9676332, 'ils': 139250.20680265102, 'inr': 3152035.4963610363, 'jpy': 5562195.809864306, 'krw': 48708234.70817213, 'kwd': 11653.748932046963, 'lkr': 12447744.79197403, 'ltc': 542.0672619894015, 'mmk': 79329006.57185428, 'mxn': 647839.6004237933, 'myr': 176649.8490325592, 'ngn': 30222887.71699782, 'nok': 401113.8941273225, 'nzd': 61518.18706832155, 'php': 2096890.033348182, 'pkr': 10801043.893607533, 'pln': 148462.83853993486, 'rub': 3359862.2859438593, 'sar': 141783.2968377078, 'sek': 389997.3527716942, 'sgd': 50284.53438542915, 'thb': 1310225.501277228, 'try': 1093372.9364098834, 'twd': 1184457.4619595886, 'uah': 1373989.783804568, 'usd': 37802.23604377473, 'vef': 3785.1378950631643, 'vnd': 916306897.1198113, 'xag': 1507.6268877860248, 'xau': 18.49814618566066, 'xdr': 28382.296844026445, 'xlm': 320263.9819240584, 'xrp': 61868.84976766581, 'yfi': 4.464236906103941, 'zar': 702777.5900662106, 'bits': 999988.159524261, 'link': 2605.741902014696, 'sats': 99998815.9524261}, 'market_cap': {'aed': 2713231289055.4175, 'ars': 265624412289194.2, 'aud': 1110016285325.0703, 'bch': 3312922972.7878137, 'bdt': 81395179548555.17, 'bhd': 278420943139.8177, 'bmd': 738816928726.5587, 'bnb': 3218821368.062354, 'brl': 3598851141519.9336, 'btc': 19555725.0, 'cad': 1002344061400.1772, 'chf': 648076172357.2906, 'clp': 642449502951382.6, 'cny': 5228755167983.591, 'czk': 16282564647125.998, 'dkk': 5005466221699.212, 'dot': 140370608970.04904, 'eos': 1091341454160.2136, 'eth': 360784399.1514299, 'eur': 671443474179.0555, 'gbp': 581267912760.2633, 'hkd': 5758857053161.826, 'huf': 253401056350694.22, 'idr': 11342391371503000, 'ils': 2721542979503.5894, 'inr': 61604217855310.15, 'jpy': 108680709032605.56, 'krw': 951956832563789.8, 'kwd': 227768393323.25308, 'lkr': 243282026124820.1, 'ltc': 10605604648.124107, 'mmk': 1550427147390880, 'mxn': 12661475116051.395, 'myr': 3452491507939.2104, 'ngn': 590684134516882.6, 'nok': 7838322314952.466, 'nzd': 1201939887597.23, 'php': 40982175036462.2, 'pkr': 211098466960395.75, 'pln': 2900927729798.394, 'rub': 65666039759413.35, 'sar': 2771050363080.6235, 'sek': 7621555644514.877, 'sgd': 982833383946.3655, 'thb': 25616814665503.72, 'try': 21368876650067.992, 'twd': 23149350827789.164, 'uah': 26853620801601.504, 'usd': 738816928726.5587, 'vef': 73977739073.39024, 'vnd': 17908545058474334, 'xag': 29459586216.042797, 'xau': 361503123.22590554, 'xdr': 554711138257.1877, 'xlm': 6264467046846.318, 'xrp': 1208951938465.6562, 'yfi': 87448439.33918354, 'zar': 13738208437554.256, 'bits': 19546758844927.99, 'link': 50865419830.56483, 'sats': 1954675884492798.8}, 'total_volume': {'aed': 72403338962.70471, 'ars': 7088242327334.646, 'aud': 29623600196.53396, 'bch': 88399558.71254647, 'bdt': 2172053226186.9766, 'bhd': 7429741062.5418, 'bmd': 19715537240.688644, 'bnb': 85895001.72775565, 'brl': 96038325006.84262, 'btc': 521538.0322084143, 'cad': 26751026705.028355, 'chf': 17296440821.25611, 'clp': 17143945418970.992, 'cny': 139463767333.18307, 'czk': 434540298553.39764, 'dkk': 133594451896.6302, 'dot': 3744250059.321743, 'eos': 29112271995.576527, 'eth': 9624209.124416424, 'eur': 17920615014.759106, 'gbp': 15512697304.942091, 'hkd': 153678472528.34717, 'huf': 6762429273556.193, 'idr': 302674899272775.7, 'ils': 72625138756.66286, 'inr': 1643925855087.4111, 'jpy': 2900931005837.713, 'krw': 25403497671543.543, 'kwd': 6077945251.633978, 'lkr': 6492049193189.642, 'ltc': 282712040.5876131, 'mmk': 41373583867449.266, 'mxn': 337876991016.02545, 'myr': 92130705525.73798, 'ngn': 15762572023930.531, 'nok': 209198628045.89798, 'nzd': 32084454123.842194, 'php': 1093620850740.9979, 'pkr': 5633221878095.762, 'pln': 77429933475.44194, 'rub': 1752316713365.9565, 'sar': 73946257191.62387, 'sek': 203400860293.99176, 'sgd': 26225607637.564034, 'thb': 683340520762.2662, 'try': 570242321665.5214, 'twd': 617746928362.4946, 'uah': 716596412962.3413, 'usd': 19715537240.688644, 'vef': 1974116743.910154, 'vnd': 477894554521742.94, 'xag': 786294070.456284, 'xau': 9647600.993358547, 'xdr': 14802622515.68141, 'xlm': 167031824656.1721, 'xrp': 32267340223.48551, 'yfi': 2328296.89946458, 'zar': 366529581287.91797, 'bits': 521538032208.4143, 'link': 1359009595.3398979, 'sats': 52153803220841.43}}, 'community_data': {'facebook_likes': None, 'twitter_followers': None, 'reddit_average_posts_48h': 0.0, 'reddit_average_comments_48h': 0.0, 'reddit_subscribers': None, 'reddit_accounts_active_48h': None}, 'developer_data': {'forks': None, 'stars': None, 'subscribers': None, 'total_issues': None, 'closed_issues': None, 'pull_requests_merged': None, 'pull_request_contributors': None, 'code_additions_deletions_4_weeks': {'additions': None, 'deletions': None}, 'commit_count_4_weeks': None}, 'public_interest_stats': {'alexa_rank': None, 'bing_matches': None}}\n"
     ]
    }
   ],
   "source": [
    "data = res.json()\n",
    "\n",
    "print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>symbol</th>\n",
       "      <th>name</th>\n",
       "      <th>localization</th>\n",
       "      <th>image</th>\n",
       "      <th>market_data</th>\n",
       "      <th>community_data</th>\n",
       "      <th>developer_data</th>\n",
       "      <th>public_interest_stats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>en</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>de</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>es</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>fr</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>it</th>\n",
       "      <td>bitcoin</td>\n",
       "      <td>btc</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>Bitcoin</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         id symbol     name localization image market_data  community_data  \\\n",
       "en  bitcoin    btc  Bitcoin      Bitcoin   NaN         NaN             NaN   \n",
       "de  bitcoin    btc  Bitcoin      Bitcoin   NaN         NaN             NaN   \n",
       "es  bitcoin    btc  Bitcoin      Bitcoin   NaN         NaN             NaN   \n",
       "fr  bitcoin    btc  Bitcoin      Bitcoin   NaN         NaN             NaN   \n",
       "it  bitcoin    btc  Bitcoin      Bitcoin   NaN         NaN             NaN   \n",
       "\n",
       "   developer_data  public_interest_stats  \n",
       "en            NaN                    NaN  \n",
       "de            NaN                    NaN  \n",
       "es            NaN                    NaN  \n",
       "fr            NaN                    NaN  \n",
       "it            NaN                    NaN  "
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Storing the data in a DataFrame\n",
    "\n",
    "URL = f'https://api.coingecko.com/api/v3/coins/bitcoin/history?date={today}'\n",
    "\n",
    "df = pd.read_json(URL)\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(56, 9)"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**This is not a output expected from running this query. Let's try and fix this.** "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Saving the data in a JSON file\n",
    "\n",
    "file_name = f'data/bitcoin_history_{today}.json'\n",
    "\n",
    "with open(file_name, 'w') as f:\n",
    "    json.dump(data, f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['id', 'symbol', 'name', 'localization', 'image', 'market_data', 'community_data', 'developer_data', 'public_interest_stats'])"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## Look at the json and try to see that you need \"market_data\" containing current_price, market_cap and total_volume\n",
    "\n",
    "data.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'current_price': {'aed': 138824.93164715782, 'ars': 13590875.375203328, 'aud': 56799.787569809756, 'bch': 169.4958115430225, 'bdt': 4164657.9422907243, 'bhd': 14245.659246388388, 'bmd': 37802.23604377473, 'bnb': 164.69361654481813, 'brl': 184142.25221643565, 'btc': 1.0, 'cad': 51291.963975995684, 'chf': 33163.901681203504, 'clp': 32871509.588490177, 'cny': 267405.45732645324, 'czk': 833180.1835228162, 'dkk': 256151.73165622173, 'dot': 7179.161430979812, 'eos': 55819.37556721214, 'eth': 18.45329501369106, 'eur': 34360.68267211343, 'gbp': 29743.78217737911, 'hkd': 294660.4914916543, 'huf': 12966166.963014709, 'idr': 580343707.9676332, 'ils': 139250.20680265102, 'inr': 3152035.4963610363, 'jpy': 5562195.809864306, 'krw': 48708234.70817213, 'kwd': 11653.748932046963, 'lkr': 12447744.79197403, 'ltc': 542.0672619894015, 'mmk': 79329006.57185428, 'mxn': 647839.6004237933, 'myr': 176649.8490325592, 'ngn': 30222887.71699782, 'nok': 401113.8941273225, 'nzd': 61518.18706832155, 'php': 2096890.033348182, 'pkr': 10801043.893607533, 'pln': 148462.83853993486, 'rub': 3359862.2859438593, 'sar': 141783.2968377078, 'sek': 389997.3527716942, 'sgd': 50284.53438542915, 'thb': 1310225.501277228, 'try': 1093372.9364098834, 'twd': 1184457.4619595886, 'uah': 1373989.783804568, 'usd': 37802.23604377473, 'vef': 3785.1378950631643, 'vnd': 916306897.1198113, 'xag': 1507.6268877860248, 'xau': 18.49814618566066, 'xdr': 28382.296844026445, 'xlm': 320263.9819240584, 'xrp': 61868.84976766581, 'yfi': 4.464236906103941, 'zar': 702777.5900662106, 'bits': 999988.159524261, 'link': 2605.741902014696, 'sats': 99998815.9524261}, 'market_cap': {'aed': 2713231289055.4175, 'ars': 265624412289194.2, 'aud': 1110016285325.0703, 'bch': 3312922972.7878137, 'bdt': 81395179548555.17, 'bhd': 278420943139.8177, 'bmd': 738816928726.5587, 'bnb': 3218821368.062354, 'brl': 3598851141519.9336, 'btc': 19555725.0, 'cad': 1002344061400.1772, 'chf': 648076172357.2906, 'clp': 642449502951382.6, 'cny': 5228755167983.591, 'czk': 16282564647125.998, 'dkk': 5005466221699.212, 'dot': 140370608970.04904, 'eos': 1091341454160.2136, 'eth': 360784399.1514299, 'eur': 671443474179.0555, 'gbp': 581267912760.2633, 'hkd': 5758857053161.826, 'huf': 253401056350694.22, 'idr': 11342391371503000, 'ils': 2721542979503.5894, 'inr': 61604217855310.15, 'jpy': 108680709032605.56, 'krw': 951956832563789.8, 'kwd': 227768393323.25308, 'lkr': 243282026124820.1, 'ltc': 10605604648.124107, 'mmk': 1550427147390880, 'mxn': 12661475116051.395, 'myr': 3452491507939.2104, 'ngn': 590684134516882.6, 'nok': 7838322314952.466, 'nzd': 1201939887597.23, 'php': 40982175036462.2, 'pkr': 211098466960395.75, 'pln': 2900927729798.394, 'rub': 65666039759413.35, 'sar': 2771050363080.6235, 'sek': 7621555644514.877, 'sgd': 982833383946.3655, 'thb': 25616814665503.72, 'try': 21368876650067.992, 'twd': 23149350827789.164, 'uah': 26853620801601.504, 'usd': 738816928726.5587, 'vef': 73977739073.39024, 'vnd': 17908545058474334, 'xag': 29459586216.042797, 'xau': 361503123.22590554, 'xdr': 554711138257.1877, 'xlm': 6264467046846.318, 'xrp': 1208951938465.6562, 'yfi': 87448439.33918354, 'zar': 13738208437554.256, 'bits': 19546758844927.99, 'link': 50865419830.56483, 'sats': 1954675884492798.8}, 'total_volume': {'aed': 72403338962.70471, 'ars': 7088242327334.646, 'aud': 29623600196.53396, 'bch': 88399558.71254647, 'bdt': 2172053226186.9766, 'bhd': 7429741062.5418, 'bmd': 19715537240.688644, 'bnb': 85895001.72775565, 'brl': 96038325006.84262, 'btc': 521538.0322084143, 'cad': 26751026705.028355, 'chf': 17296440821.25611, 'clp': 17143945418970.992, 'cny': 139463767333.18307, 'czk': 434540298553.39764, 'dkk': 133594451896.6302, 'dot': 3744250059.321743, 'eos': 29112271995.576527, 'eth': 9624209.124416424, 'eur': 17920615014.759106, 'gbp': 15512697304.942091, 'hkd': 153678472528.34717, 'huf': 6762429273556.193, 'idr': 302674899272775.7, 'ils': 72625138756.66286, 'inr': 1643925855087.4111, 'jpy': 2900931005837.713, 'krw': 25403497671543.543, 'kwd': 6077945251.633978, 'lkr': 6492049193189.642, 'ltc': 282712040.5876131, 'mmk': 41373583867449.266, 'mxn': 337876991016.02545, 'myr': 92130705525.73798, 'ngn': 15762572023930.531, 'nok': 209198628045.89798, 'nzd': 32084454123.842194, 'php': 1093620850740.9979, 'pkr': 5633221878095.762, 'pln': 77429933475.44194, 'rub': 1752316713365.9565, 'sar': 73946257191.62387, 'sek': 203400860293.99176, 'sgd': 26225607637.564034, 'thb': 683340520762.2662, 'try': 570242321665.5214, 'twd': 617746928362.4946, 'uah': 716596412962.3413, 'usd': 19715537240.688644, 'vef': 1974116743.910154, 'vnd': 477894554521742.94, 'xag': 786294070.456284, 'xau': 9647600.993358547, 'xdr': 14802622515.68141, 'xlm': 167031824656.1721, 'xrp': 32267340223.48551, 'yfi': 2328296.89946458, 'zar': 366529581287.91797, 'bits': 521538032208.4143, 'link': 1359009595.3398979, 'sats': 52153803220841.43}}\n"
     ]
    }
   ],
   "source": [
    "market_data = data['market_data']\n",
    "\n",
    "print(market_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>current_price</th>\n",
       "      <th>market_cap</th>\n",
       "      <th>total_volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>aed</th>\n",
       "      <td>1.388249e+05</td>\n",
       "      <td>2.713231e+12</td>\n",
       "      <td>7.240334e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ars</th>\n",
       "      <td>1.359088e+07</td>\n",
       "      <td>2.656244e+14</td>\n",
       "      <td>7.088242e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>aud</th>\n",
       "      <td>5.679979e+04</td>\n",
       "      <td>1.110016e+12</td>\n",
       "      <td>2.962360e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bch</th>\n",
       "      <td>1.694958e+02</td>\n",
       "      <td>3.312923e+09</td>\n",
       "      <td>8.839956e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bdt</th>\n",
       "      <td>4.164658e+06</td>\n",
       "      <td>8.139518e+13</td>\n",
       "      <td>2.172053e+12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     current_price    market_cap  total_volume\n",
       "aed   1.388249e+05  2.713231e+12  7.240334e+10\n",
       "ars   1.359088e+07  2.656244e+14  7.088242e+12\n",
       "aud   5.679979e+04  1.110016e+12  2.962360e+10\n",
       "bch   1.694958e+02  3.312923e+09  8.839956e+07\n",
       "bdt   4.164658e+06  8.139518e+13  2.172053e+12"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(market_data)\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(61, 3)"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>symbol</th>\n",
       "      <th>current_price</th>\n",
       "      <th>market_cap</th>\n",
       "      <th>total_volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>aed</td>\n",
       "      <td>1.388249e+05</td>\n",
       "      <td>2.713231e+12</td>\n",
       "      <td>7.240334e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ars</td>\n",
       "      <td>1.359088e+07</td>\n",
       "      <td>2.656244e+14</td>\n",
       "      <td>7.088242e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>aud</td>\n",
       "      <td>5.679979e+04</td>\n",
       "      <td>1.110016e+12</td>\n",
       "      <td>2.962360e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>bch</td>\n",
       "      <td>1.694958e+02</td>\n",
       "      <td>3.312923e+09</td>\n",
       "      <td>8.839956e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>bdt</td>\n",
       "      <td>4.164658e+06</td>\n",
       "      <td>8.139518e+13</td>\n",
       "      <td>2.172053e+12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>yfi</td>\n",
       "      <td>4.464237e+00</td>\n",
       "      <td>8.744844e+07</td>\n",
       "      <td>2.328297e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>zar</td>\n",
       "      <td>7.027776e+05</td>\n",
       "      <td>1.373821e+13</td>\n",
       "      <td>3.665296e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>bits</td>\n",
       "      <td>9.999882e+05</td>\n",
       "      <td>1.954676e+13</td>\n",
       "      <td>5.215380e+11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>link</td>\n",
       "      <td>2.605742e+03</td>\n",
       "      <td>5.086542e+10</td>\n",
       "      <td>1.359010e+09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>sats</td>\n",
       "      <td>9.999882e+07</td>\n",
       "      <td>1.954676e+15</td>\n",
       "      <td>5.215380e+13</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>61 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   symbol  current_price    market_cap  total_volume\n",
       "0     aed   1.388249e+05  2.713231e+12  7.240334e+10\n",
       "1     ars   1.359088e+07  2.656244e+14  7.088242e+12\n",
       "2     aud   5.679979e+04  1.110016e+12  2.962360e+10\n",
       "3     bch   1.694958e+02  3.312923e+09  8.839956e+07\n",
       "4     bdt   4.164658e+06  8.139518e+13  2.172053e+12\n",
       "..    ...            ...           ...           ...\n",
       "56    yfi   4.464237e+00  8.744844e+07  2.328297e+06\n",
       "57    zar   7.027776e+05  1.373821e+13  3.665296e+11\n",
       "58   bits   9.999882e+05  1.954676e+13  5.215380e+11\n",
       "59   link   2.605742e+03  5.086542e+10  1.359010e+09\n",
       "60   sats   9.999882e+07  1.954676e+15  5.215380e+13\n",
       "\n",
       "[61 rows x 4 columns]"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.reset_index(names=\"symbol\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **Endpoint - `coins/{id}/market_chart`**\n",
    "Get historical market data include price, market cap, and 24h volume (granularity auto)\n",
    "\n",
    "- Data granularity is automatic (cannot be adjusted)\n",
    "- 1 day from current time = 5 minute interval data\n",
    "- 1 - 90 days from current time = hourly data\n",
    "- Above 90 days from current time = daily data (00:00 UTC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "200"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "uid = \"bitcoin\"\n",
    "\n",
    "ROOT_URL = \"https://api.coingecko.com/api/v3\"\n",
    "endpoint = f\"/coins/{uid}/market_chart\"\n",
    "payload = {'vs_currency' : 'usd', 'days' : '1'}\n",
    "\n",
    "res = requests.get(ROOT_URL + endpoint, params=payload)\n",
    "\n",
    "res.status_code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'prices': [[1701166520838, 37035.48846243298], [1701166797375, 37075.29581490049], [1701167105745, 37082.837240588706], [1701167427498, 37009.015703796285], [1701167716570, 37059.99099605156], [1701168060495, 37068.269163940626], [1701168317457, 37075.86579976039], [1701168658883, 37039.04878763506], [1701168894386, 37045.34014702563], [1701169214217, 37089.56810257802], [1701169505454, 37097.56908507261], [1701169808656, 37084.83274999467], [1701170110696, 37113.481467923746], [1701170400141, 37132.85791656357], [1701170721207, 37189.966779104994], [1701171060646, 37179.91933083843], [1701171323383, 37243.21799385789], [1701171602613, 37170.017235401065], [1701171911213, 37185.300747243535], [1701172219035, 37199.795190040466], [1701172510191, 37226.8290786621], [1701172795752, 37252.98078174806], [1701173092481, 37258.41057566368], [1701173400046, 37231.60477636279], [1701173731680, 37206.1310586252], [1701174081264, 37186.71357640221], [1701174308875, 37183.01218726654], [1701174610148, 37226.66352183825], [1701174917480, 37256.005926542], [1701175225490, 37264.29466554781], [1701175517254, 37271.99962092563], [1701175834837, 37222.72084826378], [1701176101731, 37198.39977907306], [1701176417512, 37206.318066066924], [1701176729785, 37176.83052216338], [1701177039052, 37156.03130875568], [1701177329165, 37175.033248889304], [1701177626394, 37191.77429010652], [1701177905840, 37174.66379613621], [1701178214200, 37261.47036391053], [1701178506735, 37327.525594397055], [1701178805477, 37296.77915995432], [1701179125052, 37303.20237957695], [1701179413348, 37316.52676991585], [1701179698965, 37336.822479033035], [1701180023161, 37433.766836494455], [1701180309277, 37392.39225196649], [1701180639103, 37389.55296668114], [1701180927195, 37387.289690379796], [1701181227350, 37360.20066119235], [1701181527134, 37378.22089082436], [1701181814152, 37435.341391842485], [1701182103866, 37396.06750892186], [1701182412548, 37416.162475246274], [1701182701135, 37431.314744792435], [1701183001098, 37430.827654839195], [1701183321609, 37425.210722313335], [1701183599317, 37394.07643077547], [1701183900683, 37399.349636863895], [1701184221483, 37437.87147564132], [1701184542390, 37414.34252842101], [1701184797520, 37431.3344833061], [1701185107900, 37463.23819872831], [1701185428549, 37429.453226084064], [1701185719455, 37331.69665576495], [1701186053715, 37319.38706506482], [1701186322590, 37513.15839996969], [1701186648190, 37490.82063019501], [1701186926925, 37498.44306463815], [1701187265983, 37551.95101167001], [1701187534830, 37581.12896989806], [1701187835049, 37656.87998052411], [1701188121960, 37598.14799815933], [1701188441071, 37670.56108723121], [1701188720039, 37622.523005330724], [1701189022463, 37597.41500601148], [1701189317969, 37689.21587806464], [1701189615204, 37713.412448408315], [1701189945342, 37778.089903585416], [1701190253075, 37847.9722117803], [1701190553043, 37913.65188183311], [1701190840675, 37861.731990081025], [1701191105979, 37947.692096896535], [1701191425981, 37794.843792432235], [1701191713114, 37915.48736263533], [1701192023626, 37948.1224644595], [1701192309563, 38148.4761666481], [1701192613449, 38101.6332509345], [1701192916202, 38130.162459814994], [1701193248846, 38134.93538543553], [1701193527896, 38219.89403699005], [1701193814928, 38246.6035761104], [1701194136693, 38170.41938875429], [1701194464757, 38207.4879089428], [1701194762901, 38059.224292965555], [1701195010507, 38067.57740140255], [1701195361484, 38122.53223445706], [1701195606589, 38120.77127832684], [1701195931976, 38119.04908923495], [1701196200388, 38119.025492996], [1701196500112, 38082.83727437835], [1701196820024, 38061.034259673484], [1701197098173, 38127.51077761819], [1701197418992, 38102.22655509994], [1701197718102, 37882.95861243113], [1701198064911, 38028.624156199294], [1701198354009, 38107.95991567454], [1701198694917, 38006.48252843267], [1701198952840, 38113.315737780475], [1701199274096, 38064.38697414793], [1701199564386, 38055.82499753733], [1701199893858, 38091.69327981942], [1701200165180, 38081.86203364255], [1701200393002, 38093.19633182102], [1701200701976, 38350.51848204315], [1701200990937, 38184.7526573095], [1701201325122, 38261.22764442761], [1701201696749, 38124.46785576648], [1701201933126, 38134.524135721964], [1701202245181, 38070.35402712003], [1701202511646, 38197.67787553766], [1701202798165, 38226.68354053206], [1701203096642, 38148.55145758413], [1701203400323, 38097.90872896024], [1701203698115, 38106.63918822386], [1701204064671, 38164.19719432143], [1701204333374, 38178.098381657226], [1701204599602, 38221.47544219856], [1701204906381, 38247.067863730925], [1701205215129, 38283.11682242528], [1701205502610, 38172.855880024596], [1701205812536, 38152.05155376034], [1701206110798, 38154.06985956733], [1701206452054, 38144.63262795665], [1701206718103, 38138.120386643444], [1701207056107, 38104.87488773975], [1701207312595, 38092.97762187427], [1701207664335, 38069.31407287678], [1701207899328, 38021.404200430916], [1701208198630, 38003.56628955487], [1701208517310, 37961.1614417206], [1701208826333, 37986.86179095247], [1701209116863, 37936.71194624162], [1701209435387, 38003.31150441127], [1701209739116, 38029.83883739299], [1701210050429, 38056.70058625295], [1701210307883, 37957.53656316075], [1701210618248, 37972.90192180476], [1701210903047, 37981.32151001592], [1701211222229, 37977.121509842174], [1701211500393, 37993.18388835254], [1701211810028, 37964.9644100175], [1701212106237, 37823.821220234415], [1701212428357, 37847.94968682901], [1701212735362, 37840.84713169288], [1701213036635, 37874.66846068007], [1701213335488, 37926.15778839326], [1701213671997, 37896.38909344837], [1701213928908, 37873.331812219665], [1701214269739, 37866.899111255145], [1701214550323, 37842.67197994237], [1701214848008, 37737.360066715155], [1701215149388, 37803.309664026536], [1701215449577, 37778.18729251391], [1701215705063, 37802.23604377473], [1701216003205, 37843.46006125882], [1701216303762, 37799.26131029845], [1701216604359, 37696.42817406068], [1701216904405, 37707.78857301145], [1701217205765, 37734.56386688112], [1701217502756, 37778.608210719336], [1701217804477, 37771.37240140918], [1701218100133, 37819.165018056156], [1701218398556, 37873.17528636316], [1701218700210, 37901.000891776006], [1701218999278, 37885.77143054811], [1701219298317, 37896.495876000896], [1701219622592, 37924.900777888855], [1701219908413, 38058.92492905566], [1701220206713, 38010.011961286815], [1701220506440, 38071.20394510655], [1701220807731, 38016.022345009835], [1701221102760, 38031.657195128], [1701221404976, 38042.29852113492], [1701221513312, 38059.64491600236], [1701221709852, 38056.13576526029], [1701222007011, 37989.84136792035], [1701222315125, 38030.42607871267], [1701222625209, 38007.675128828974], [1701222915351, 37987.832929890916], [1701223213590, 37963.24457231813], [1701223507201, 37936.01830012139], [1701223817282, 37918.68362232894], [1701224116952, 37990.51135742778], [1701224417504, 37989.47739904006], [1701224716002, 37914.26030266363], [1701225014714, 37929.67889330992], [1701225314553, 37874.86994657803], [1701225613745, 37864.9128806638], [1701225924618, 37877.69289749973], [1701226275011, 37893.47199462185], [1701226540300, 37919.148111568866], [1701226920699, 37942.01030780579], [1701227157171, 37966.72797305147], [1701227447120, 37973.52116275185], [1701227744134, 38007.089338187565], [1701228073166, 37987.74725732027], [1701228351024, 37979.33911128615], [1701228695754, 37981.08423202015], [1701228942635, 37985.81184853055], [1701229200226, 37980.23823223714], [1701229511541, 37930.006702083], [1701229829308, 37917.76636675312], [1701230128239, 37927.545827586], [1701230426861, 37952.83945309689], [1701230740834, 37955.753123638155], [1701231034121, 37927.07492480009], [1701231363472, 37935.47128157664], [1701231704140, 37904.964427827596], [1701231971307, 37898.53528061774], [1701232228931, 37892.51185459306], [1701232539298, 37904.90387776303], [1701232836975, 37901.57995842999], [1701233117313, 37908.82719606704], [1701233426635, 37908.678114881564], [1701233712080, 37918.65956045931], [1701234024054, 37970.54442913396], [1701234306930, 37988.41286994122], [1701234669527, 37993.97353179395], [1701234909796, 37987.808956976856], [1701235201472, 37968.14665829734], [1701235495766, 37950.18244721721], [1701235796819, 37945.6495305406], [1701236095351, 37944.2205742788], [1701236406238, 37923.06648201583], [1701236714875, 37960.70801728345], [1701237024843, 37971.97849650515], [1701237301926, 38016.71960938207], [1701237600125, 38025.97341221481], [1701237899223, 38053.951384459186], [1701238213383, 38018.494300281396], [1701238501620, 38043.781357114196], [1701238810943, 38012.12677953351], [1701239121710, 38025.74689524493], [1701239424830, 38033.52133793584], [1701239715566, 38092.451922981236], [1701240002213, 38094.923270598636], [1701240300676, 38124.41649909065], [1701240604464, 38104.98127280786], [1701240915066, 38241.31885641977], [1701241207232, 38189.71043871588], [1701241525480, 38192.720722221864], [1701241801647, 38181.16120246523], [1701242100699, 38107.83251510998], [1701242421892, 38109.2018119825], [1701242706732, 38101.521796208304], [1701243006451, 38168.14054525148], [1701243305452, 38090.21864309078], [1701243603624, 38087.418504269976], [1701243894532, 38085.86485397892], [1701244211748, 38128.79952350584], [1701244510713, 38180.80133415089], [1701244808624, 38102.40254429801], [1701245109833, 38154.04969689481], [1701245397311, 38167.863767365205], [1701245711060, 38171.986664372605], [1701246007578, 38120.44510938575], [1701246303939, 38137.60044137436], [1701246612274, 38161.73208035959], [1701246920627, 38141.771632800956], [1701247199171, 38123.90058175873], [1701247495916, 38241.75737829281], [1701247816313, 38246.516353526575], [1701248107863, 38324.21798772258], [1701248396434, 38329.03761090173], [1701248694924, 38304.54473477258], [1701249004026, 38284.476427544265], [1701249304287, 38255.620933703576], [1701249612462, 38326.444004735444], [1701249891308, 38272.653572613584], [1701250240992, 38233.32429384064], [1701250520392, 38209.92055826026], [1701250798466, 38242.947810728656], [1701251099143, 38211.45100427343], [1701251412276, 38271.311164096966], [1701251713164, 38200.47594533367], [1701252007533, 38308.56019539666], [1701252318449, 38190.50505178061], [1701252617324, 38214.77410403715], [1701252875000, 38274.29588484593]], 'market_caps': [[1701166520838, 724383501668.2338], [1701166797375, 724383501668.2338], [1701167105745, 725316451989.9222], [1701167427498, 725316451989.9222], [1701167716570, 723718444827.7673], [1701168060495, 724617189429.65], [1701168317457, 724617189429.65], [1701168658883, 724299806750.9268], [1701168894386, 724299806750.9268], [1701169214217, 724299806750.9268], [1701169505454, 725179672725.9711], [1701169808656, 725179672725.9711], [1701170110696, 725207166337.7662], [1701170400141, 725207166337.7662], [1701170721207, 726694757347.8186], [1701171060646, 726771589282.8448], [1701171323383, 726771589282.8448], [1701171602613, 726771589282.8448], [1701171911213, 726888480870.5745], [1701172219035, 726888480870.5745], [1701172510191, 727437465105.7953], [1701172795752, 727437465105.7953], [1701173092481, 728765263403.9027], [1701173400046, 728765263403.9027], [1701173731680, 728027302308.3733], [1701174081264, 727034835836.8892], [1701174308875, 727034835836.8892], [1701174610148, 727034835836.8892], [1701174917480, 727976559587.3357], [1701175225490, 728844482623.0989], [1701175517254, 728844482623.0989], [1701175834837, 727900058540.6605], [1701176101731, 727900058540.6605], [1701176417512, 727900058540.6605], [1701176729785, 727585781566.3752], [1701177039052, 726593111699.7292], [1701177329165, 726593111699.7292], [1701177626394, 727295597131.6085], [1701177905840, 727295597131.6085], [1701178214200, 727295597131.6085], [1701178506735, 728661207047.9122], [1701178805477, 728661207047.9122], [1701179125052, 729293392168.3213], [1701179413348, 729293392168.3213], [1701179698965, 729721643972.4465], [1701180023161, 729721643972.4465], [1701180309277, 732022792428.2064], [1701180639103, 731169997390.4512], [1701180927195, 731169997390.4512], [1701181227350, 731169997390.4512], [1701181527134, 730591799999.8478], [1701181814152, 730591799999.8478], [1701182103866, 731947857707.4651], [1701182412548, 731947857707.4651], [1701182701135, 731790848782.5906], [1701183001098, 731790848782.5906], [1701183321609, 731974088136.6364], [1701183599317, 731974088136.6364], [1701183900683, 731256391354.5986], [1701184221483, 731256391354.5986], [1701184542390, 732112551854.7562], [1701184797520, 732112551854.7562], [1701185107900, 732346857010.9375], [1701185428549, 732346857010.9375], [1701185719455, 731945775768.2808], [1701186053715, 729757072697.4459], [1701186322590, 729757072697.4459], [1701186648190, 733112329034.2262], [1701186926925, 733112329034.2262], [1701187265983, 733747829942.422], [1701187534830, 733747829942.422], [1701187835049, 733747829942.422], [1701188121960, 736396744075.7004], [1701188441071, 736668171558.8689], [1701188720039, 736668171558.8689], [1701189022463, 736668171558.8689], [1701189317969, 735227611862.2211], [1701189615204, 735227611862.2211], [1701189945342, 737507674184.1201], [1701190253075, 740125825203.2213], [1701190553043, 740125825203.2213], [1701190840675, 740388203930.138], [1701191105979, 740388203930.138], [1701191425981, 740388203930.138], [1701191713114, 739121318174.3947], [1701192023626, 739121318174.3947], [1701192309563, 742094243216.8805], [1701192613449, 742094243216.8805], [1701192916202, 745109933554.4695], [1701193248846, 745750924423.1979], [1701193527896, 745750924423.1979], [1701193814928, 745750924423.1979], [1701194136693, 747854639950.5402], [1701194464757, 747854639950.5402], [1701194762901, 747458211844.3889], [1701195010507, 747458211844.3889], [1701195361484, 744439381469.7712], [1701195606589, 744439381469.7712], [1701195931976, 745371655952.3257], [1701196200388, 745371655952.3257], [1701196500112, 745483434659.4072], [1701196820024, 745483434659.4072], [1701197098173, 744329663437.4763], [1701197418992, 744329663437.4763], [1701197718102, 745110255039.5009], [1701198064911, 745110255039.5009], [1701198354009, 744357134506.7515], [1701198694917, 743357151060.0823], [1701198952840, 743357151060.0823], [1701199274096, 743357151060.0823], [1701199564386, 744370329503.7557], [1701199893858, 744854633993.7599], [1701200165180, 744854633993.7599], [1701200393002, 744854633993.7599], [1701200701976, 744888563170.1052], [1701200990937, 744888563170.1052], [1701201325122, 745434334834.0841], [1701201696749, 746413217062.9066], [1701201933126, 746413217062.9066], [1701202245181, 744459947633.8986], [1701202511646, 744459947633.8986], [1701202798165, 744459947633.8986], [1701203096642, 746808192068.4427], [1701203400323, 746808192068.4427], [1701203698115, 745023268878.7393], [1701204064671, 746252209002.1832], [1701204333374, 746252209002.1832], [1701204599602, 746252209002.1832], [1701204906381, 747491534669.8774], [1701205215129, 747491534669.8774], [1701205502610, 748719578839.87], [1701205812536, 748719578839.87], [1701206110798, 746090542173.7467], [1701206452054, 745922381462.3961], [1701206718103, 745922381462.3961], [1701207056107, 745165321612.976], [1701207312595, 745165321612.976], [1701207664335, 744911363967.963], [1701207899328, 744911363967.963], [1701208198630, 744911363967.963], [1701208517310, 743192304289.5461], [1701208826333, 743192304289.5461], [1701209116863, 742859179463.0425], [1701209435387, 742859179463.0425], [1701209739116, 743181092763.6349], [1701210050429, 744207243662.1709], [1701210307883, 744207243662.1709], [1701210618248, 744207243662.1709], [1701210903047, 742581897905.9465], [1701211222229, 742581897905.9465], [1701211500393, 742665801571.9152], [1701211810028, 742452968575.9263], [1701212106237, 742452968575.9263], [1701212428357, 741008473771.0082], [1701212735362, 741008473771.0082], [1701213036635, 740487571805.5934], [1701213335488, 740487571805.5934], [1701213671997, 741163623692.4388], [1701213928908, 741163623692.4388], [1701214269739, 740722427240.8776], [1701214550323, 740722427240.8776], [1701214848008, 737972359582.8585], [1701215149388, 737972359582.8585], [1701215449577, 738816928726.5587], [1701215705063, 738816928726.5587], [1701216003205, 738816928726.5587], [1701216303762, 740100480208.6777], [1701216604359, 740100480208.6777], [1701216904405, 737129719965.6246], [1701217205765, 737129719965.6246], [1701217502756, 737816482027.6039], [1701217804477, 737816482027.6039], [1701218100133, 738643929704.5713], [1701218398556, 740637628015.966], [1701218700210, 740637628015.966], [1701218999278, 740637628015.966], [1701219298317, 740879641993.8813], [1701219622592, 740879641993.8813], [1701219908413, 741649157814.0853], [1701220206713, 741649157814.0853], [1701220506440, 743351318993.3536], [1701220807731, 743351318993.3536], [1701221102760, 743378013401.1516], [1701221404976, 743378013401.1516], [1701221513312, 743877518591.0593], [1701221709852, 744479561524.8499], [1701222007011, 744479561524.8499], [1701222315125, 742924408593.3942], [1701222625209, 742924408593.3942], [1701222915351, 743007977787.0801], [1701223213590, 743007977787.0801], [1701223507201, 742392801370.0033], [1701223817282, 742392801370.0033], [1701224116952, 741562569347.9666], [1701224417504, 741562569347.9666], [1701224716002, 742915050620.1237], [1701225014714, 742915050620.1237], [1701225314553, 741723208947.2158], [1701225613745, 740464684814.6302], [1701225924618, 740464684814.6302], [1701226275011, 740523268907.7195], [1701226540300, 740523268907.7195], [1701226920699, 742342672340.0299], [1701227157171, 742342672340.0299], [1701227447120, 742604446737.5585], [1701227744134, 742604446737.5585], [1701228073166, 743167282920.2542], [1701228351024, 743167282920.2542], [1701228695754, 742622357272.8186], [1701228942635, 742622357272.8186], [1701229200226, 742622357272.8186], [1701229511541, 742671569624.9247], [1701229829308, 741555279992.5107], [1701230128239, 741555279992.5107], [1701230426861, 741555279992.5107], [1701230740834, 742196445507.0627], [1701231034121, 742196445507.0627], [1701231363472, 741677649631.3611], [1701231704140, 741538814458.9075], [1701231971307, 741538814458.9075], [1701232228931, 741538814458.9075], [1701232539298, 741106342135.5553], [1701232836975, 741235921417.7161], [1701233117313, 741235921417.7161], [1701233426635, 741337598081.9281], [1701233712080, 741337598081.9281], [1701234024054, 741337598081.9281], [1701234306930, 742548583305.6753], [1701234669527, 742548583305.6753], [1701234909796, 743047618993.4135], [1701235201472, 743047618993.4135], [1701235495766, 742499375975.0538], [1701235796819, 742499375975.0538], [1701236095351, 742097221702.9095], [1701236406238, 742097221702.9095], [1701236714875, 741667952053.0973], [1701237024843, 741667952053.0973], [1701237301926, 742578112878.7299], [1701237600125, 742578112878.7299], [1701237899223, 744017086436.1644], [1701238213383, 744017086436.1644], [1701238501620, 743462891581.6156], [1701238810943, 743462891581.6156], [1701239121710, 743348716769.3182], [1701239424830, 743783277050.0239], [1701239715566, 743783277050.0239], [1701240002213, 744986717047.847], [1701240300676, 744986717047.847], [1701240604464, 744986717047.847], [1701240915066, 745264819693.9081], [1701241207232, 745264819693.9081], [1701241525480, 746864927244.4777], [1701241801647, 746709063512.1267], [1701242100699, 746709063512.1267], [1701242421892, 746709063512.1267], [1701242706732, 745264007945.5515], [1701243006451, 745264007945.5515], [1701243305452, 746408461859.067], [1701243603624, 744875048155.8079], [1701243894532, 744875048155.8079], [1701244211748, 744875048155.8079], [1701244510713, 745657306072.1417], [1701244808624, 745361845520.2588], [1701245109833, 745361845520.2588], [1701245397311, 745361845520.2588], [1701245711060, 746478190961.7283], [1701246007578, 746478190961.7283], [1701246303939, 745465373811.1881], [1701246612274, 745465373811.1881], [1701246920627, 746293401644.8492], [1701247199171, 746293401644.8492], [1701247495916, 745724362691.8397], [1701247816313, 745724362691.8397], [1701248107863, 747951015614.4814], [1701248396434, 747951015614.4814], [1701248694924, 750238197827.7289], [1701249004026, 750238197827.7289], [1701249304287, 748702009098.03], [1701249612462, 748702009098.03], [1701249891308, 749426863209.48], [1701250240992, 747667072794.56], [1701250520392, 747667072794.56], [1701250798466, 747667072794.56], [1701251099143, 747831582140.4347], [1701251412276, 747831582140.4347], [1701251713164, 748720178262.0339], [1701252007533, 748720178262.0339], [1701252318449, 749322044082.7133], [1701252617324, 749322044082.7133], [1701252875000, 747333964465.492]], 'total_volumes': [[1701166520838, 16121648295.912514], [1701166797375, 19017084047.93305], [1701167105745, 15279110068.254183], [1701167427498, 19128754199.500477], [1701167716570, 19040770670.2812], [1701168060495, 13750295078.66321], [1701168317457, 16756016924.679651], [1701168658883, 18663628396.87989], [1701168894386, 18093188803.875034], [1701169214217, 17221786708.568928], [1701169505454, 13651361431.641378], [1701169808656, 15790713898.02502], [1701170110696, 17283760995.42674], [1701170400141, 16787676297.733866], [1701170721207, 18234411785.24894], [1701171060646, 16345799546.984106], [1701171323383, 18306916527.654125], [1701171602613, 15832837502.700335], [1701171911213, 15153013097.520329], [1701172219035, 17495639433.487625], [1701172510191, 14404413134.352495], [1701172795752, 17115135684.694439], [1701173092481, 17084534254.660381], [1701173400046, 17485382627.03831], [1701173731680, 15814252681.94328], [1701174081264, 16021183784.161795], [1701174308875, 16678446852.054579], [1701174610148, 17677243591.917282], [1701174917480, 15996414407.693617], [1701175225490, 16917536295.249989], [1701175517254, 17239654114.929214], [1701175834837, 17533647897.99554], [1701176101731, 16843527250.839094], [1701176417512, 15382589598.751991], [1701176729785, 17457781948.099705], [1701177039052, 13704000201.984833], [1701177329165, 17398910431.269978], [1701177626394, 17250709329.404716], [1701177905840, 13379549650.824968], [1701178214200, 17215206366.251953], [1701178506735, 16994061897.2534], [1701178805477, 14844090284.320011], [1701179125052, 13989972862.342537], [1701179413348, 17218591830.241867], [1701179698965, 12118884761.19134], [1701180023161, 15907849680.1461], [1701180309277, 14383980428.00155], [1701180639103, 16174826739.15784], [1701180927195, 16853700391.943398], [1701181227350, 16965066528.491291], [1701181527134, 16760401921.800995], [1701181814152, 17046957542.083868], [1701182103866, 16938310416.161692], [1701182412548, 15714349762.731918], [1701182701135, 14503399006.659513], [1701183001098, 9039636969.821539], [1701183321609, 13826508822.288824], [1701183599317, 16954010595.099627], [1701183900683, 14183154752.118685], [1701184221483, 15928761526.328577], [1701184542390, 16645999622.843504], [1701184797520, 14956040097.117203], [1701185107900, 15776225607.016922], [1701185428549, 11452322362.051146], [1701185719455, 16514312664.959057], [1701186053715, 16624406834.314165], [1701186322590, 16766897231.815096], [1701186648190, 14276229901.16881], [1701186926925, 14441631903.449255], [1701187265983, 15139704331.826443], [1701187534830, 15140227877.582996], [1701187835049, 16066328606.397732], [1701188121960, 16739616795.869186], [1701188441071, 17000876635.97931], [1701188720039, 16896582910.074514], [1701189022463, 14393494072.946083], [1701189317969, 16303522130.391487], [1701189615204, 15723837906.335657], [1701189945342, 15337180239.623552], [1701190253075, 17205641309.531494], [1701190553043, 17317647386.0584], [1701190840675, 16953274629.300539], [1701191105979, 17432062495.521534], [1701191425981, 17729720793.587093], [1701191713114, 17558125159.843704], [1701192023626, 15445405552.28437], [1701192309563, 16486177326.20045], [1701192613449, 17966848965.063244], [1701192916202, 18011796992.69349], [1701193248846, 17398782843.574726], [1701193527896, 18886099264.06084], [1701193814928, 18611139825.722126], [1701194136693, 15742858170.096203], [1701194464757, 18619332028.150764], [1701194762901, 19019273786.13309], [1701195010507, 17228109829.618065], [1701195361484, 16432773457.450008], [1701195606589, 12783470373.33273], [1701195931976, 17380181418.821186], [1701196200388, 15764932402.843512], [1701196500112, 17401576476.096092], [1701196820024, 19366438594.60086], [1701197098173, 19482771244.785965], [1701197418992, 19004187181.31433], [1701197718102, 18875486810.01951], [1701198064911, 19941126742.878582], [1701198354009, 18592116483.33614], [1701198694917, 20105910367.996014], [1701198952840, 20106318146.385883], [1701199274096, 20237995701.241016], [1701199564386, 19999481751.154636], [1701199893858, 4150030014.4160542], [1701200165180, 11588699171.315222], [1701200393002, 18959604559.2983], [1701200701976, 20996279041.462692], [1701200990937, 19078149361.888153], [1701201325122, 19236483315.71666], [1701201696749, 19303687741.287193], [1701201933126, 18752606278.57272], [1701202245181, 21310339899.69898], [1701202511646, 21416416553.041756], [1701202798165, 21145484392.809826], [1701203096642, 21135163586.863342], [1701203400323, 21444584525.604294], [1701203698115, 21312533508.848694], [1701204064671, 13622853476.014479], [1701204333374, 17977948416.48616], [1701204599602, 19714944291.217316], [1701204906381, 20987471722.521076], [1701205215129, 21906508872.509094], [1701205502610, 21618470683.658417], [1701205812536, 21679393264.856358], [1701206110798, 21623624582.62055], [1701206452054, 18812963552.292187], [1701206718103, 21131414127.85265], [1701207056107, 21404614995.38834], [1701207312595, 20754072279.81293], [1701207664335, 17164070665.351889], [1701207899328, 21696241366.867146], [1701208198630, 18370770090.51578], [1701208517310, 21803584653.72575], [1701208826333, 21131764495.48381], [1701209116863, 21790563781.195614], [1701209435387, 21679852327.627907], [1701209739116, 21679649342.566124], [1701210050429, 19773307349.760628], [1701210307883, 21856382497.16561], [1701210618248, 21873716913.30303], [1701210903047, 17592969913.648426], [1701211222229, 21837721175.46054], [1701211500393, 22033225316.50575], [1701211810028, 17608573235.781765], [1701212106237, 22304913909.12025], [1701212428357, 22213720177.509537], [1701212735362, 21226025900.534695], [1701213036635, 21129114460.127113], [1701213335488, 19467781420.15925], [1701213671997, 20386529139.696804], [1701213928908, 19561365274.477444], [1701214269739, 22218033525.537987], [1701214550323, 22133946265.339626], [1701214848008, 22462821432.74834], [1701215149388, 22252211691.844547], [1701215449577, 20141838901.845016], [1701215705063, 19715537240.688644], [1701216003205, 22447645694.137634], [1701216303762, 22431199810.788536], [1701216604359, 22604481224.05664], [1701216904405, 17130046312.540167], [1701217205765, 19171220919.306572], [1701217502756, 22527664717.79796], [1701217804477, 20135936219.4202], [1701218100133, 22371312295.777378], [1701218398556, 22349946893.125565], [1701218700210, 22186240569.938942], [1701218999278, 20886561214.471775], [1701219298317, 17163404291.934488], [1701219622592, 16729338930.725658], [1701219908413, 22860352150.492596], [1701220206713, 22215299360.202377], [1701220506440, 21886725623.738533], [1701220807731, 21979485455.37805], [1701221102760, 22601549335.341423], [1701221404976, 19904552942.78168], [1701221513312, 22008244359.339256], [1701221709852, 22853793035.815132], [1701222007011, 22634981125.246838], [1701222315125, 22898652247.643555], [1701222625209, 22873547521.33912], [1701222915351, 22919338279.62129], [1701223213590, 22731056350.56037], [1701223507201, 21232005806.550285], [1701223817282, 22877477009.44663], [1701224116952, 22645324774.42435], [1701224417504, 19885042395.873936], [1701224716002, 23058140498.23402], [1701225014714, 18589926821.521538], [1701225314553, 23066952547.329166], [1701225613745, 22652171299.391838], [1701225924618, 23026196988.489952], [1701226275011, 23130515715.38974], [1701226540300, 20320228338.280437], [1701226920699, 21282791730.49694], [1701227157171, 22277657630.98602], [1701227447120, 17961277772.299076], [1701227744134, 22937710859.17571], [1701228073166, 22878211437.4189], [1701228351024, 23209466950.789513], [1701228695754, 21924969552.550537], [1701228942635, 20085876802.83102], [1701229200226, 15053399933.113966], [1701229511541, 19606842826.53032], [1701229829308, 22462930771.973373], [1701230128239, 22411913978.902332], [1701230426861, 21278632481.40332], [1701230740834, 20105152871.295322], [1701231034121, 22687316716.231266], [1701231363472, 22267927738.05257], [1701231704140, 23280071418.40345], [1701231971307, 23184248303.729794], [1701232228931, 22825633459.2645], [1701232539298, 23016262692.0543], [1701232836975, 22610742733.24008], [1701233117313, 23266903227.913284], [1701233426635, 23239743927.588367], [1701233712080, 21088550180.82765], [1701234024054, 23274637296.967106], [1701234306930, 23164658054.59926], [1701234669527, 16733836378.093681], [1701234909796, 19700561967.204285], [1701235201472, 22306208634.79735], [1701235495766, 22458965268.19865], [1701235796819, 22945489607.63666], [1701236095351, 21642089450.52498], [1701236406238, 22803340444.59225], [1701236714875, 22891285634.3307], [1701237024843, 19948035480.45741], [1701237301926, 23084914234.07227], [1701237600125, 18856165177.00134], [1701237899223, 18209890282.97875], [1701238213383, 21460347106.380947], [1701238501620, 22168093464.128674], [1701238810943, 22147522923.625237], [1701239121710, 22180877234.555916], [1701239424830, 21828512316.794426], [1701239715566, 22914930324.34804], [1701240002213, 21913155097.205524], [1701240300676, 18717993633.085976], [1701240604464, 22383414649.326916], [1701240915066, 23306948493.314606], [1701241207232, 21847350226.494038], [1701241525480, 20692623992.457623], [1701241801647, 15658755028.447842], [1701242100699, 23329234858.21693], [1701242421892, 20321121544.72058], [1701242706732, 20192132245.65727], [1701243006451, 19419649993.9888], [1701243305452, 23237587500.275913], [1701243603624, 22894959878.767704], [1701243894532, 16548374139.531887], [1701244211748, 23517868049.044456], [1701244510713, 23332482003.17326], [1701244808624, 23335640479.197945], [1701245109833, 23423987923.88273], [1701245397311, 20628283800.689995], [1701245711060, 21267451396.259583], [1701246007578, 23341585341.70775], [1701246303939, 20058786079.139072], [1701246612274, 22634489563.45233], [1701246920627, 22499002323.622326], [1701247199171, 23130226736.294132], [1701247495916, 23743449424.242203], [1701247816313, 18345886480.27219], [1701248107863, 23434561705.52888], [1701248396434, 18099821435.210365], [1701248694924, 13564816554.300474], [1701249004026, 21700808062.71332], [1701249304287, 21865922593.39547], [1701249612462, 23989903803.825924], [1701249891308, 23903239714.660595], [1701250240992, 23721643913.942726], [1701250520392, 23852992079.452408], [1701250798466, 23954702048.703163], [1701251099143, 21708790322.464287], [1701251412276, 14408661032.295504], [1701251713164, 24144058478.797707], [1701252007533, 24198909196.464725], [1701252318449, 24673350175.788116], [1701252617324, 23024895520.36034], [1701252875000, 24717402849.629787]]}\n"
     ]
    }
   ],
   "source": [
    "print(res.json())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['prices', 'market_caps', 'total_volumes'])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = res.json()\n",
    "\n",
    "data.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[1701166520838, 37035.48846243298],\n",
       " [1701166797375, 37075.29581490049],\n",
       " [1701167105745, 37082.837240588706],\n",
       " [1701167427498, 37009.015703796285],\n",
       " [1701167716570, 37059.99099605156]]"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['prices'][:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[1701166520838, 724383501668.2338],\n",
       " [1701166797375, 724383501668.2338],\n",
       " [1701167105745, 725316451989.9222],\n",
       " [1701167427498, 725316451989.9222],\n",
       " [1701167716570, 723718444827.7673]]"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['market_caps'][:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[1701166520838, 37035.48846243298]</td>\n",
       "      <td>[1701166520838, 724383501668.2338]</td>\n",
       "      <td>[1701166520838, 16121648295.912514]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[1701166797375, 37075.29581490049]</td>\n",
       "      <td>[1701166797375, 724383501668.2338]</td>\n",
       "      <td>[1701166797375, 19017084047.93305]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[1701167105745, 37082.837240588706]</td>\n",
       "      <td>[1701167105745, 725316451989.9222]</td>\n",
       "      <td>[1701167105745, 15279110068.254183]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[1701167427498, 37009.015703796285]</td>\n",
       "      <td>[1701167427498, 725316451989.9222]</td>\n",
       "      <td>[1701167427498, 19128754199.500477]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[1701167716570, 37059.99099605156]</td>\n",
       "      <td>[1701167716570, 723718444827.7673]</td>\n",
       "      <td>[1701167716570, 19040770670.2812]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                prices                         market_caps  \\\n",
       "0   [1701166520838, 37035.48846243298]  [1701166520838, 724383501668.2338]   \n",
       "1   [1701166797375, 37075.29581490049]  [1701166797375, 724383501668.2338]   \n",
       "2  [1701167105745, 37082.837240588706]  [1701167105745, 725316451989.9222]   \n",
       "3  [1701167427498, 37009.015703796285]  [1701167427498, 725316451989.9222]   \n",
       "4   [1701167716570, 37059.99099605156]  [1701167716570, 723718444827.7673]   \n",
       "\n",
       "                         total_volumes  \n",
       "0  [1701166520838, 16121648295.912514]  \n",
       "1   [1701166797375, 19017084047.93305]  \n",
       "2  [1701167105745, 15279110068.254183]  \n",
       "3  [1701167427498, 19128754199.500477]  \n",
       "4    [1701167716570, 19040770670.2812]  "
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(data)\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      1701166520838\n",
       "1      1701166797375\n",
       "2      1701167105745\n",
       "3      1701167427498\n",
       "4      1701167716570\n",
       "           ...      \n",
       "285    1701251713164\n",
       "286    1701252007533\n",
       "287    1701252318449\n",
       "288    1701252617324\n",
       "289    1701252875000\n",
       "Name: prices, Length: 290, dtype: int64"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['prices'].str[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[1701166520838, 37035.48846243298]</td>\n",
       "      <td>[1701166520838, 724383501668.2338]</td>\n",
       "      <td>[1701166520838, 16121648295.912514]</td>\n",
       "      <td>1701166520838</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[1701166797375, 37075.29581490049]</td>\n",
       "      <td>[1701166797375, 724383501668.2338]</td>\n",
       "      <td>[1701166797375, 19017084047.93305]</td>\n",
       "      <td>1701166797375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[1701167105745, 37082.837240588706]</td>\n",
       "      <td>[1701167105745, 725316451989.9222]</td>\n",
       "      <td>[1701167105745, 15279110068.254183]</td>\n",
       "      <td>1701167105745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[1701167427498, 37009.015703796285]</td>\n",
       "      <td>[1701167427498, 725316451989.9222]</td>\n",
       "      <td>[1701167427498, 19128754199.500477]</td>\n",
       "      <td>1701167427498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[1701167716570, 37059.99099605156]</td>\n",
       "      <td>[1701167716570, 723718444827.7673]</td>\n",
       "      <td>[1701167716570, 19040770670.2812]</td>\n",
       "      <td>1701167716570</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                prices                         market_caps  \\\n",
       "0   [1701166520838, 37035.48846243298]  [1701166520838, 724383501668.2338]   \n",
       "1   [1701166797375, 37075.29581490049]  [1701166797375, 724383501668.2338]   \n",
       "2  [1701167105745, 37082.837240588706]  [1701167105745, 725316451989.9222]   \n",
       "3  [1701167427498, 37009.015703796285]  [1701167427498, 725316451989.9222]   \n",
       "4   [1701167716570, 37059.99099605156]  [1701167716570, 723718444827.7673]   \n",
       "\n",
       "                         total_volumes      timestamp  \n",
       "0  [1701166520838, 16121648295.912514]  1701166520838  \n",
       "1   [1701166797375, 19017084047.93305]  1701166797375  \n",
       "2  [1701167105745, 15279110068.254183]  1701167105745  \n",
       "3  [1701167427498, 19128754199.500477]  1701167427498  \n",
       "4    [1701167716570, 19040770670.2812]  1701167716570  "
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['timestamp'] = df['prices'].str[0]\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['prices'] = df['prices'].str[1]\n",
    "\n",
    "df['market_caps'] = df['market_caps'].str[1]\n",
    "\n",
    "df['total_volumes'] = df['total_volumes'].str[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>37035.488462</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.612165e+10</td>\n",
       "      <td>1701166520838</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>37075.295815</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.901708e+10</td>\n",
       "      <td>1701166797375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>37082.837241</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.527911e+10</td>\n",
       "      <td>1701167105745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>37009.015704</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.912875e+10</td>\n",
       "      <td>1701167427498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>37059.990996</td>\n",
       "      <td>7.237184e+11</td>\n",
       "      <td>1.904077e+10</td>\n",
       "      <td>1701167716570</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         prices   market_caps  total_volumes      timestamp\n",
       "0  37035.488462  7.243835e+11   1.612165e+10  1701166520838\n",
       "1  37075.295815  7.243835e+11   1.901708e+10  1701166797375\n",
       "2  37082.837241  7.253165e+11   1.527911e+10  1701167105745\n",
       "3  37009.015704  7.253165e+11   1.912875e+10  1701167427498\n",
       "4  37059.990996  7.237184e+11   1.904077e+10  1701167716570"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1701166520838</td>\n",
       "      <td>37035.488462</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.612165e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1701166797375</td>\n",
       "      <td>37075.295815</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.901708e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1701167105745</td>\n",
       "      <td>37082.837241</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.527911e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1701167427498</td>\n",
       "      <td>37009.015704</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.912875e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1701167716570</td>\n",
       "      <td>37059.990996</td>\n",
       "      <td>7.237184e+11</td>\n",
       "      <td>1.904077e+10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       timestamp        prices   market_caps  total_volumes\n",
       "0  1701166520838  37035.488462  7.243835e+11   1.612165e+10\n",
       "1  1701166797375  37075.295815  7.243835e+11   1.901708e+10\n",
       "2  1701167105745  37082.837241  7.253165e+11   1.527911e+10\n",
       "3  1701167427498  37009.015704  7.253165e+11   1.912875e+10\n",
       "4  1701167716570  37059.990996  7.237184e+11   1.904077e+10"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = df[['timestamp', 'prices', 'market_caps', 'total_volumes']]\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>2.900000e+02</td>\n",
       "      <td>290.000000</td>\n",
       "      <td>2.900000e+02</td>\n",
       "      <td>2.900000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.701210e+12</td>\n",
       "      <td>37839.394662</td>\n",
       "      <td>7.398175e+11</td>\n",
       "      <td>1.941963e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.503471e+07</td>\n",
       "      <td>357.502846</td>\n",
       "      <td>7.056773e+09</td>\n",
       "      <td>3.220481e+09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.701167e+12</td>\n",
       "      <td>37009.015704</td>\n",
       "      <td>7.237184e+11</td>\n",
       "      <td>4.150030e+09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.701188e+12</td>\n",
       "      <td>37604.241750</td>\n",
       "      <td>7.352276e+11</td>\n",
       "      <td>1.699577e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.701210e+12</td>\n",
       "      <td>37960.934730</td>\n",
       "      <td>7.424229e+11</td>\n",
       "      <td>1.982917e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.701231e+12</td>\n",
       "      <td>38102.358547</td>\n",
       "      <td>7.449679e+11</td>\n",
       "      <td>2.224367e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.701253e+12</td>\n",
       "      <td>38350.518482</td>\n",
       "      <td>7.502382e+11</td>\n",
       "      <td>2.471740e+10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          timestamp        prices   market_caps  total_volumes\n",
       "count  2.900000e+02    290.000000  2.900000e+02   2.900000e+02\n",
       "mean   1.701210e+12  37839.394662  7.398175e+11   1.941963e+10\n",
       "std    2.503471e+07    357.502846  7.056773e+09   3.220481e+09\n",
       "min    1.701167e+12  37009.015704  7.237184e+11   4.150030e+09\n",
       "25%    1.701188e+12  37604.241750  7.352276e+11   1.699577e+10\n",
       "50%    1.701210e+12  37960.934730  7.424229e+11   1.982917e+10\n",
       "75%    1.701231e+12  38102.358547  7.449679e+11   2.224367e+10\n",
       "max    1.701253e+12  38350.518482  7.502382e+11   2.471740e+10"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 290 entries, 0 to 289\n",
      "Data columns (total 4 columns):\n",
      " #   Column         Non-Null Count  Dtype  \n",
      "---  ------         --------------  -----  \n",
      " 0   timestamp      290 non-null    int64  \n",
      " 1   prices         290 non-null    float64\n",
      " 2   market_caps    290 non-null    float64\n",
      " 3   total_volumes  290 non-null    float64\n",
      "dtypes: float64(3), int64(1)\n",
      "memory usage: 9.2 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     1970-01-01 00:28:21.166520838\n",
       "1     1970-01-01 00:28:21.166797375\n",
       "2     1970-01-01 00:28:21.167105745\n",
       "3     1970-01-01 00:28:21.167427498\n",
       "4     1970-01-01 00:28:21.167716570\n",
       "                   ...             \n",
       "285   1970-01-01 00:28:21.251713164\n",
       "286   1970-01-01 00:28:21.252007533\n",
       "287   1970-01-01 00:28:21.252318449\n",
       "288   1970-01-01 00:28:21.252617324\n",
       "289   1970-01-01 00:28:21.252875000\n",
       "Name: timestamp, Length: 290, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.to_datetime(df['timestamp'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     1970-01-01 00:28:21.166520838\n",
       "1     1970-01-01 00:28:21.166797375\n",
       "2     1970-01-01 00:28:21.167105745\n",
       "3     1970-01-01 00:28:21.167427498\n",
       "4     1970-01-01 00:28:21.167716570\n",
       "                   ...             \n",
       "285   1970-01-01 00:28:21.251713164\n",
       "286   1970-01-01 00:28:21.252007533\n",
       "287   1970-01-01 00:28:21.252318449\n",
       "288   1970-01-01 00:28:21.252617324\n",
       "289   1970-01-01 00:28:21.252875000\n",
       "Name: timestamp, Length: 290, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.to_datetime(df['timestamp'], unit='ns')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     2023-11-28 10:15:20.838\n",
       "1     2023-11-28 10:19:57.375\n",
       "2     2023-11-28 10:25:05.745\n",
       "3     2023-11-28 10:30:27.498\n",
       "4     2023-11-28 10:35:16.570\n",
       "                ...          \n",
       "285   2023-11-29 09:55:13.164\n",
       "286   2023-11-29 10:00:07.533\n",
       "287   2023-11-29 10:05:18.449\n",
       "288   2023-11-29 10:10:17.324\n",
       "289   2023-11-29 10:14:35.000\n",
       "Name: timestamp, Length: 290, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# unit = (D, s, ms, us, ns)\n",
    "\n",
    "pd.to_datetime(df['timestamp'], unit='ms')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 290 entries, 0 to 289\n",
      "Data columns (total 4 columns):\n",
      " #   Column         Non-Null Count  Dtype         \n",
      "---  ------         --------------  -----         \n",
      " 0   timestamp      290 non-null    datetime64[ns]\n",
      " 1   prices         290 non-null    float64       \n",
      " 2   market_caps    290 non-null    float64       \n",
      " 3   total_volumes  290 non-null    float64       \n",
      "dtypes: datetime64[ns](1), float64(3)\n",
      "memory usage: 9.2 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2023-11-28 10:15:20.838</td>\n",
       "      <td>37035.488462</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.612165e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2023-11-28 10:19:57.375</td>\n",
       "      <td>37075.295815</td>\n",
       "      <td>7.243835e+11</td>\n",
       "      <td>1.901708e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2023-11-28 10:25:05.745</td>\n",
       "      <td>37082.837241</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.527911e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2023-11-28 10:30:27.498</td>\n",
       "      <td>37009.015704</td>\n",
       "      <td>7.253165e+11</td>\n",
       "      <td>1.912875e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2023-11-28 10:35:16.570</td>\n",
       "      <td>37059.990996</td>\n",
       "      <td>7.237184e+11</td>\n",
       "      <td>1.904077e+10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                timestamp        prices   market_caps  total_volumes\n",
       "0 2023-11-28 10:15:20.838  37035.488462  7.243835e+11   1.612165e+10\n",
       "1 2023-11-28 10:19:57.375  37075.295815  7.243835e+11   1.901708e+10\n",
       "2 2023-11-28 10:25:05.745  37082.837241  7.253165e+11   1.527911e+10\n",
       "3 2023-11-28 10:30:27.498  37009.015704  7.253165e+11   1.912875e+10\n",
       "4 2023-11-28 10:35:16.570  37059.990996  7.237184e+11   1.904077e+10"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2023-11-29 10:14:35')"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['timestamp'].max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>prices</th>\n",
       "      <th>market_caps</th>\n",
       "      <th>total_volumes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>290</td>\n",
       "      <td>290.000000</td>\n",
       "      <td>2.900000e+02</td>\n",
       "      <td>2.900000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2023-11-28 22:16:02.233948416</td>\n",
       "      <td>37839.394662</td>\n",
       "      <td>7.398175e+11</td>\n",
       "      <td>1.941963e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2023-11-28 10:15:20.838000</td>\n",
       "      <td>37009.015704</td>\n",
       "      <td>7.237184e+11</td>\n",
       "      <td>4.150030e+09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2023-11-28 16:16:41.737750016</td>\n",
       "      <td>37604.241750</td>\n",
       "      <td>7.352276e+11</td>\n",
       "      <td>1.699577e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2023-11-28 22:18:14.772499968</td>\n",
       "      <td>37960.934730</td>\n",
       "      <td>7.424229e+11</td>\n",
       "      <td>1.982917e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2023-11-29 04:14:41.134249984</td>\n",
       "      <td>38102.358547</td>\n",
       "      <td>7.449679e+11</td>\n",
       "      <td>2.224367e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2023-11-29 10:14:35</td>\n",
       "      <td>38350.518482</td>\n",
       "      <td>7.502382e+11</td>\n",
       "      <td>2.471740e+10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>NaN</td>\n",
       "      <td>357.502846</td>\n",
       "      <td>7.056773e+09</td>\n",
       "      <td>3.220481e+09</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           timestamp        prices   market_caps  \\\n",
       "count                            290    290.000000  2.900000e+02   \n",
       "mean   2023-11-28 22:16:02.233948416  37839.394662  7.398175e+11   \n",
       "min       2023-11-28 10:15:20.838000  37009.015704  7.237184e+11   \n",
       "25%    2023-11-28 16:16:41.737750016  37604.241750  7.352276e+11   \n",
       "50%    2023-11-28 22:18:14.772499968  37960.934730  7.424229e+11   \n",
       "75%    2023-11-29 04:14:41.134249984  38102.358547  7.449679e+11   \n",
       "max              2023-11-29 10:14:35  38350.518482  7.502382e+11   \n",
       "std                              NaN    357.502846  7.056773e+09   \n",
       "\n",
       "       total_volumes  \n",
       "count   2.900000e+02  \n",
       "mean    1.941963e+10  \n",
       "min     4.150030e+09  \n",
       "25%     1.699577e+10  \n",
       "50%     1.982917e+10  \n",
       "75%     2.224367e+10  \n",
       "max     2.471740e+10  \n",
       "std     3.220481e+09  "
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **Visualizing the Trends**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/8AAAFkCAYAAAB2PIv/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC+1ElEQVR4nOzdd1xT5/7A8U8Swt5bBBQFAQcOXLhq3aO2dmirttrWjntv965dt97+qrXbW1vtsPNqa7XVLhfaOuoWUXHgBBVk7xlCcn5/hEQQUECU4ff9euWlOTnn5EkeCPme5/t8H5WiKApCCCGEEEIIIYRotdRN3QAhhBBCCCGEEEJcXRL8CyGEEEIIIYQQrZwE/0IIIYQQQgghRCsnwb8QQgghhBBCCNHKSfAvhBBCCCGEEEK0chL8CyGEEEIIIYQQrZwE/0IIIYQQQgghRCsnwb8QQgghhBBCCNHKSfAvhBBCCCGEEEK0chL8CyGEEC3QvffeS/v27Zu6GVdVc36NzbltQgghRE0k+BdCCCGaCZVKVafbpk2bmrqprdbQoUOrvNfu7u706dOHL7/8EqPR2CjPMWfOHFatWtUo5xJCCCHqyqqpGyCEEEIIk++++67K/W+//Zbo6Ohq28PDw/n8888bLRhtrprqNfr7+zN37lwAMjIy+Pbbb5k5cybHjx/nrbfeuuLzz5kzhzvuuIOJEyde8bmEEEKIupLgXwghhGgm7r777ir3d+7cSXR0dLXtrV1RUREODg5otdomeX4XF5cq7/nDDz9MaGgoCxYs4I033miydgkhhBBXQtL+hRBCiBbo4jnniYmJqFQq3n33XT7++GM6dOiAvb09o0aN4ty5cyiKwhtvvIG/vz92dnbccsstZGdnVzvvmjVrGDx4MA4ODjg5OTF+/HgOHz5cZZ/U1FTuu+8+/P39sbGxoU2bNtxyyy0kJibW+1z33nsvjo6OnDp1inHjxuHk5MS0adNqfI0ARqORDz/8kC5dumBra4uPjw8PP/wwOTk5Vfbbu3cvo0ePxtPTEzs7O4KCgrj//vvr+S6b2Nvb079/f4qKisjIyKh1v6KiIp555hkCAgKwsbEhNDSUd999F0VRLPuoVCqKior45ptvLFML7r333ga1SwghhKgPGfkXQgghWpElS5ZQVlbGY489RnZ2Nm+//TaTJ09m2LBhbNq0iRdeeIGTJ0/y0Ucf8eyzz/Lll19ajv3uu++YMWMGo0ePZt68eRQXF7Nw4UIGDRpEbGysJRC//fbbOXz4MI899hjt27cnPT2d6Ohozp49a9mnrucCKC8vZ/To0QwaNIh3330Xe3v7Wl/fww8/zNdff819993H448/TkJCAgsWLCA2NpZt27ah1WpJT09n1KhReHl58eKLL+Lq6kpiYiI///xzg9/X06dPo9FocHV1rfFxRVG4+eab+euvv5g5cyY9evRg3bp1PPfccyQnJ/PBBx9Y3pcHHniAvn378tBDDwHQsWPHBrdLCCGEqDNFCCGEEM3SI488otT2p3rGjBlKu3btLPcTEhIUQPHy8lJyc3Mt22fNmqUASvfu3RW9Xm/ZPmXKFMXa2lopLS1VFEVRCgoKFFdXV+XBBx+s8jypqamKi4uLZXtOTo4CKO+8806t7a7rucyvA1BefPHFy77GrVu3KoCyZMmSKvutXbu2yvaVK1cqgLJnz55a21ibG264QQkLC1MyMjKUjIwM5ejRo8rjjz+uAMqECRNqbduqVasUQPm///u/Kue74447FJVKpZw8edKyzcHBQZkxY0a92yaEEEJcCUn7F0IIIVqRSZMm4eLiYrnfr18/wFRPwMrKqsr2srIykpOTAYiOjiY3N5cpU6aQmZlpuWk0Gvr168dff/0FgJ2dHdbW1mzatKlaqr1ZXc9V2T//+c/Lvrbly5fj4uLCyJEjq5w3MjISR0dHy3nNo/O///47er2+Du9aVfHx8Xh5eeHl5UV4eDgfffQR48ePr5IlcbHVq1ej0Wh4/PHHq2x/5plnUBSFNWvW1LsdQgghRGOStH8hhBCiFQkMDKxy33whICAgoMbt5gD+xIkTAAwbNqzG8zo7OwNgY2PDvHnzeOaZZ/Dx8aF///7cdNNNTJ8+HV9f33qdy8zKygp/f//LvrYTJ06Ql5eHt7d3jY+np6cDcMMNN3D77bcze/ZsPvjgA4YOHcrEiROZOnUqNjY2l32e9u3b8/nnn6NSqbC1tSUkJKTW5zQ7c+YMfn5+ODk5VdkeHh5ueVwIIYRoShL8CyGEEK2IRqOp13alohideUm97777zhLEV1Y5a+DJJ59kwoQJrFq1inXr1vHqq68yd+5c/vzzT3r27Fmvc4HpgoJafflkRKPRiLe3N0uWLKnxcS8vL8BUVG/FihXs3LmT3377jXXr1nH//ffz3nvvsXPnThwdHS/5PA4ODowYMeKy7RFCCCFaEgn+hRBCCGEpOuft7V2nwLdjx44888wzPPPMM5w4cYIePXrw3nvv8b///a/e56pPGzds2MDAgQOxs7O77P79+/enf//+vPnmmyxdupRp06bxww8/8MADDzRam8zatWvHhg0bKCgoqDL6Hx8fb3ncTKVSNfrzCyGEEJcjc/6FEEIIwejRo3F2dmbOnDk1zpM3L3FXXFxMaWlplcc6duyIk5MTOp2uXueqr8mTJ2MwGHjjjTeqPVZeXk5ubi5gmsqgVFpeD6BHjx4AljY2tnHjxmEwGFiwYEGV7R988AEqlYqxY8datjk4OFjaKoQQQlwrMvIvhBBCCJydnVm4cCH33HMPvXr14q677sLLy4uzZ8/yxx9/MHDgQBYsWMDx48cZPnw4kydPpnPnzlhZWbFy5UrS0tK466676nWu+rrhhht4+OGHmTt3Lvv372fUqFFotVpOnDjB8uXLmT9/PnfccQfffPMNn3zyCbfeeisdO3akoKCAzz//HGdnZ8aNG9fYbx0AEyZM4MYbb+Tll18mMTGR7t27s379en755ReefPLJKsv5RUZGsmHDBt5//338/PwICgqyFGYUQgghrhYJ/oUQQggBwNSpU/Hz8+Ott97inXfeQafT0bZtWwYPHsx9990HmAoHTpkyhY0bN/Ldd99hZWVFWFgYP/74I7fffnu9ztUQixYtIjIykk8//ZSXXnoJKysr2rdvz913383AgQMB00WC3bt388MPP5CWloaLiwt9+/ZlyZIlBAUFXdmbVAu1Ws2vv/7Ka6+9xrJly/jqq69o374977zzDs8880yVfd9//30eeughXnnlFUpKSpgxY4YE/0IIIa46lXJxXpwQQgghhBBCCCFaFZnzL4QQQgghhBBCtHIS/AshhBBCCCGEEK2cBP9CCCGEEEIIIUQrJ8G/EEIIIYQQQgjRyknwL4QQQgghhBBCtHIS/AshhBBCCCGEEK2cVVM++cKFC1m4cCGJiYkAdOnShddee42xY8cCkJqaynPPPUd0dDQFBQWEhoby8ssvV1lH2Eyn09GvXz8OHDhAbGwsPXr0sDx28OBBHnnkEfbs2YOXlxePPfYYzz//fJXjly9fzquvvkpiYiIhISHMmzePcePG1fm1GI1Gzp8/j5OTEyqVqv5vhhBCCCGEEEIIUQ+KolBQUICfnx9q9WXG9pUm9Ouvvyp//PGHcvz4ceXYsWPKSy+9pGi1WuXQoUOKoijKyJEjlT59+ii7du1STp06pbzxxhuKWq1W9u3bV+1cjz/+uDJ27FgFUGJjYy3b8/LyFB8fH2XatGnKoUOHlO+//16xs7NTPv30U8s+27ZtUzQajfL2228rR44cUV555RVFq9UqcXFxdX4t586dUwC5yU1ucpOb3OQmN7nJTW5yk5vcrunt3Llzl41ZVYqiKDQj7u7uvPPOO8ycORNHR0cWLlzIPffcY3ncw8ODefPm8cADD1i2rVmzhqeffpqffvqJLl26VBn5X7hwIS+//DKpqalYW1sD8OKLL7Jq1Sri4+MBuPPOOykqKuL333+3nLN///706NGDRYsW1dhOnU6HTqez3M/LyyMwMJCEhAScnJwa7f0QjUOv1/PXX39x4403otVqm7o5ohbST82f9FHLIP3UMkg/tQzST82f9FHLIP10dRQUFBAUFERubi4uLi6X3LdJ0/4rMxgMLF++nKKiIqKiogAYMGAAy5YtY/z48bi6uvLjjz9SWlrK0KFDLcelpaXx4IMPsmrVKuzt7audd8eOHQwZMsQS+AOMHj2aefPmkZOTg5ubGzt27ODpp5+uctzo0aNZtWpVre2dO3cus2fPrvH5amqHaHr29vbs2rWrqZshLkP6qfmTPmoZpJ9aBumnlkH6qfmTPmoZpJ8aX3FxMUCdpp43efAfFxdHVFQUpaWlODo6snLlSjp37gzAjz/+yJ133omHhwdWVlbY29uzcuVKgoODAVAUhXvvvZd//OMf9O7d21I7oLLU1FSCgoKqbPPx8bE85ubmRmpqqmVb5X1SU1NrbfesWbOqXDDIz88nICCAUaNG4ezs3KD3Qlw9er2e6OhoRo4cKVcamzHpp+ZP+qhlkH5qGaSfWgbpp+ZP+qhlkH66OvLz8+u8b5MH/6Ghoezfv5+8vDxWrFjBjBkz2Lx5M507d+bVV18lNzeXDRs24OnpyapVq5g8eTJbt26lW7dufPTRRxQUFDBr1qxr3m4bGxtsbGyqbddqtfLD3IxJ/7QM0k/Nn/RRyyD91DJIP7UM0k/Nn/RRyyD91Ljq8142efBvbW1tGcmPjIxkz549zJ8/n+eff54FCxZw6NAhunTpAkD37t3ZunUrH3/8MYsWLeLPP/9kx44d1YLw3r17M23aNL755ht8fX1JS0ur8rj5vq+vr+XfmvYxPy6EEEIIIYQQQrRkl1kL4NozGo3odDrL3IWLlyvQaDQYjUYA/vvf/3LgwAH279/P/v37Wb16NQDLli3jzTffBCAqKootW7ag1+st54iOjiY0NBQ3NzfLPhs3bqzyPNHR0ZbaA0IIIYQQQgghREvWpCP/s2bNYuzYsQQGBlJQUMDSpUvZtGkT69atIywsjODgYB5++GHeffddPDw8WLVqFdHR0Zaq/IGBgVXO5+joCEDHjh3x9/cHYOrUqcyePZuZM2fywgsvcOjQIebPn88HH3xgOe6JJ57ghhtu4L333mP8+PH88MMP7N27l88+++wavRNCCCGEEEIIIcTV06TBf3p6OtOnTyclJQUXFxciIiJYt24dI0eOBGD16tW8+OKLTJgwgcLCQoKDg/nmm28YN25cnZ/DxcWF9evX88gjjxAZGYmnpyevvfYaDz30kGWfAQMGsHTpUl555RVeeuklQkJCWLVqFV27dm301yyEEEIIIYQQQlxrTRr8L168+JKPh4SE8NNPP9X5fO3bt0dRlGrbIyIi2Lp16yWPnTRpEpMmTarzcwkhhLh+fLjhOMk5Jbx9R0SdltIRQgghhGhumt2cfyGEEKI5MRoVFvx5kuUxSZzOLGrq5gghhBBCNIgE/0IIIcQlFJSWU240ZZWl5pU2cWuEEEIIIRpGgn8hhBDiEnKKyyz/T5HgXwghhKi39IJSfjuYQnyuTJ1rSk06518IIYRo7ioH/6l5JU3YEiGEEKJl+e3AeRb8eZJjaQUVWzREHs9gRBe/Sx5Xqjcw8eNteDha87+Z/aTeTiORkX8hhBDiEmTkXwghhKg/RVH4z+9HOJZWgEoFvs42ADy74hDJuZe+mL7jdBbxqQVsO5nFoeT8a9Hc64IE/0IIIcQl5BTpLf+XOf9CCCFE3ZzJKiajQIe1Rs3ul0aw4anBBDoo5JboeWTJPsrKjbUe+/eJTMv/1xxKafS26Q1GTqQV1LhSXGsmwb8QQghxCTLyL4QQQtTfnsRsACL8XfByssHGSs29nQy42Fmx/1wub/5xpNZjt57IsPx/7aHURg/S562JZ+QHW1h3OLVRz9vcSfAvhBBCXEJucaWR/3wJ/oUQQoi62JuYA0Dv9u6WbR628Pbt3QD4ZscZPtp4otpxqXmlHE8rRKUCa42a05lFHE8rbNS27UowXZjYnZDTqOdt7iT4F0IIIS4hu9LIf3ZRGaV6QxO2RgghhGgZ9pwxBdh92rtV2T4s1IuXx4UD8F70cT7fcrrK43+fNKX8R/i7MjjEE2jc1H+jUeFEuqkAofnf64UE/0IIIcQl5FYK/gHSWsDof0mZgXRZmEAIIUQTySrUcTqjCIDIdm7VHn9wSAeeGdkJgDdXH+W7HYmWx8wp/4ODPRnT1Rcwpf43lnM5xZTqTfUGTqY3bkZBcyfBvxBCCHEJlQv+QfOf968oCg98t48391tx+LxUSBZCCHHt7T1jSqfv5OOIq711jfs8NjyER27sCMC/fz3MwaRcjEbFUuxvcIgnIzv7YKVWEZ9aQEJmUaO0rfIUgpS8UgpK9TXu1xoz/ST4F0IIIS7BXPBPozatMdzcK/6vO5zG7op5luZ/hRBCiGtpb0Wxv8rz/Wvy7KhQbopog1GB51cc5GByHllFZdhba+gZ6IarvTVRHT2AhqX+lxuMrIlLoVBXbtl2PK1qqv+JGkb/C3Xl9PjPeu5YuL3KsS2dBP9CCCHEJZiD/w6eDkDzLvpXbjDyzrp4y/1TGddXOqMQQojmYU/FxeeL5/tfTKVSMfvmLrg7WBOfWsATP8QCENXBA2srU6g6rlsbAJbsPFvv0fhPt5zmn0v28c7aC38bj6VWDf5P1lBMcNfpLEr1RtILdDjaWNXrOZszCf6FEEKIWiiKQk5Ftf/wNs5A1ZH/r7Yl8MjSfejKm0dq4E/7kjiVcSEt8mR646RICiGEEHVVUmbgUHIeAL3bXXrkH8DD0YZ/T+gMwJmsYgBLoT+AW3u2pY2LLcm5JXy5LaFebfllfzIAG46mW5YLNI/8B7rbAzUX/dtaaepBayLBvxBCCFGLEr2BsnJTUSBz8J+SZ6qkV6o3MG9tPH8cTGH7yawma6NZqd7AB9GmJZNu7WEaJTmZUdjoayMLIYQQl7L/XC7lRgVfZ1v83ezqdMzN3f0YHuZtuT8oxMvyf1uthudGhwLwyV+nyCrU1emcJ9MLLfP7k3NLOJtdTLnBaClEOD7C9LeyprR/84oDEvwLIYRo9YrLyvl8y+lGK67TUplH/a01ajp6VaT9V4z8x5zJsVQLvnj+YFP4Znsiqfml+LnY8sq4MFQo5JWUk1lYdvmDhRBCiCukKApnsor4aV8SAL3bu6FSqep0rEql4s1bu+HrbEvPQFfL31yziT3a0rWtM4W6cuZvPFGnc669qEbA3yczScwqpsxgxN5aw9BOpgsMJy5K+0/JK+FkeiFqFUR1lOBfCCFEK/fvXw7z5uqj/PvXw03dlCaVU2QKnF3ttfi5mkYvzNX+t1QsRQRwrImD/2OpBXyw4TgAT43shLOdFg8b02PX2xrGQghxrZUbjLz+6+FGXY6upfl+91n6zdnIDe9sYkWMKfjvF3T5lP/KfF1s2fz8UH76x4BqFw3UahUvjQsHYMmus9WW6NtyPIM+b25gZWySZdvqOFN/mGv2bDuZablYH+LtSCcfJ8CUFVBUqaifOeU/wt8VFzttvV5DcyfBvxBCiCr+jE9jecUfblPBm+Yxn70pmIv9udlb4+tiC0BGoQ69wcjW45mW/S4eNbiWinTl/GtJDKV6I0M6eXF7L38AfO1N6f6nrrM1jIUQ4lrbeiKTr7cn8vyKA82mBsy19tHGE6QX6NBqVES2c+PxYcHcERlQ7/PYWGlQq2vOFhjQ0ZMR4d4YjApvrTlq2W6++JJRoOO1VaZ/EzOLOJKSj0at4uXxposG209lEZ9iWgK3k48Tbg7WeDqarpRXvphgXmpwSCtL+QcJ/oUQQlSSV6znxZ/iLPd15Ub2nbl+l4szp/272mtxt7dGq1GhKHDkfD5HKr5AgGl03Wis+9x6vcHIHwdTLJkFDaUoCq+uOsSpjCJ8nG34YHJ3y5cmHztz2yT4F0KIq+l0xRS5/NJyNh3LuMzerU+RrpzzFVlx218czk//HMDTo0Kxs9Y0+nO9ODYMjVrFhqPp/HrgPAArYpIsfVCgK+etNfGsqcjCiOrgwQ2dvHC0sSK3WM8vFceE+ppG/UO8HYELfyuNRsUy379y3YHWQoJ/IYQQFrN/O0x6gY4OXg6M6+YLXCh6cz3KrTTyr1ar8HE2jf6bUxrDfJ2wtlJTqjdyLqe4zueds/oojyzdx5zVRy+/8yWsiEni59hk1Cr4aEovPCpGMAB87UwXI5oyK0EIIa4HiZXq4/y6/3wTtqRpmOsDeThY4+Vkc5m9r0ywtxOPDO0IwKyfDhKfmm+pAXBrz7aAaeWbrypWBRjbzRcrjZr+HTyAC6sJhFSk/If4mIN/03SAIyn5ZBeV4WCtoWeg61V9LU2hSYP/hQsXEhERgbOzM87OzkRFRbFmzRrL46mpqdxzzz34+vri4OBAr169+OmnnyyPJyYmMnPmTIKCgrCzs6Njx478+9//pqys6kjKwYMHGTx4MLa2tgQEBPD2229Xa8vy5csJCwvD1taWbt26sXr16qv3woUQohk6nlZgCSTfndSdYWE+AGw71fSV7JtKTpFp5N/NwRqANhWp/+alg24I9SLYy/TF4Xgdg+xDyXl8sz0RMF1YaWg1/nKDkXfWHQPgmVGh9L1obqVPRdq/jPwLIcTVlZh1IfjfcDSNglJ9E7bm2jOnzHes+Ht4tT0+PIS+Qe4UlRm47ZPtpOSZit3Ova0bk3ubpr6lF+hQq2BUZ9NAxqBgjyrnCLUE/6Z/T1b8DTcPePTv4IFW0/rGyZv0Ffn7+/PWW28RExPD3r17GTZsGLfccguHD5sKTE2fPp1jx47x66+/EhcXx2233cbkyZOJjY0FID4+HqPRyKeffsrhw4f54IMPWLRoES+99JLlOfLz8xk1ahTt2rUjJiaGd955h9dff53PPvvMss/27duZMmUKM2fOJDY2lokTJzJx4kQOHTp0bd8QIYRoQnsTTen9UR096BXoxsCKP5RxSbnkFV/4InOuEOIq1u9t7S7M+TcV/PF1MeXS55eaCgMNCfGik485+L98YT2DUeHllXGYZwik5JWSlFPSoLZtPp5BeoEODwdrHhzcodrj5rT/zEKdJYNBCCFE4zMH/9YaNbpy43VX+O9URkXw731tgn8rjZr/3tUTdwdristMNRaeGBGCrVbDC2PCcLa1AqBPe3dLJsKgSvP3nWyt8HE2bTen/R9PLyCjQMeXf5syBoZ0an0p/9DEwf+ECRMYN24cISEhdOrUiTfffBNHR0d27twJmILyxx57jL59+9KhQwdeeeUVXF1diYmJAWDMmDF89dVXjBo1ig4dOnDzzTfz7LPP8vPPP1ueY8mSJZSVlfHll1/SpUsX7rrrLh5//HHef/99yz7z589nzJgxPPfcc4SHh/PGG2/Qq1cvFixYcG3fECGEaEJxybmAqbotQBsXOzp6OWBUYMdp0+h/YlYRHxzScPeXeykuK6/lTK1H5YJ/cGHkH8BWqyaynRudKuYN1iX4X7LrDAeS8nCysaJDxTJGexKzG9S2H/eeA0xpjtZW1f+c22rAr6K9F1dFFkII0TjKyo0kV1zEvbOPqcCdeS769cIS/F+0PN/V5Otiywd39kCjVhHq42QpduvhaMMbE7viZGPFzEFBlv07ejlaAv5QHyfLagLm4P9cdgn/WhJDeoGOEG9HJlVkELQ2Vk3dADODwcDy5cspKioiKioKgAEDBrBs2TLGjx+Pq6srP/74I6WlpQwdOrTW8+Tl5eHufiH1cceOHQwZMgRra2vLttGjRzNv3jxycnJwc3Njx44dPP3001XOM3r0aFatWlXr8+h0OnQ6neV+fr6p8JNer0evv75SfVoCc59I3zRv0k9Na//ZXAC6+Dpa+iCqgzunMor4+0Q6w0M9eHvtcQyKiuIyA6fT8i0Fc1qr7ELT57yTjRq9Xo+X44Ulf/q1d0eDkQ4epiH2Yyn5l/zZzSku4+21FWn6I4M5l1PC6Ywidp3OZEI3n3q1K6tQx8aj6QDc1qNNtec13+/gac/5vFLiU/Lo3rZ191VLJJ95LYP0U/PXlH2UkFGEUQF7aw0zogL4bucZtp3M5Hx2IZ6O1uSXluNsa1Xn9e5bohMVF7/bu9tesg8au58GBLmy7omBuNppUYwG9EZTFsC4Lt6M6zKs2nMN6ODOyv0pBHs7WLY726hxs9eSU6xnT2IODtYaPrqrO1qV0mJ+5+vTziYP/uPi4oiKiqK0tBRHR0dWrlxJ586dAfjxxx+588478fDwwMrKCnt7e1auXElwcHCN5zp58iQfffQR7777rmVbamoqQUFBVfbz8fGxPObm5kZqaqplW+V9UlNrT9mZO3cus2fPrrZ9/fr12Nvb1+3Fi2suOjq6qZsg6kD66dorM8CxNA2gIuN4DKvPmLbb5KoADesPnMW9MIHo+At/Nn7Z8Ddd3Rs2X72lSEwxvSenjh5kdeoBzmeZ3g8Ad30aq1evJqsUwIoT6QX89sdqNLV8v4vLVlGo0+Blq+CSeYikHNO5Nh1OYrX2TL3a9dd5FeVGDe0cFU7EbOFELftZFWcCajbsPoRT+sF6PYe4duQzr2WQfmr+mqKPDld8lrtZlXN45ybaO2pILFRx0/xNFJWDzqDCz15hakcDAdcmK/6aMihwOsP0t/LsoT2sPnn5Y5rqd6mrCs56qgnWJ7J6daJlu7tGQw6mP96T2pVxbM9mjjVJCxumuLjuBYebPPgPDQ1l//795OXlsWLFCmbMmMHmzZvp3Lkzr776Krm5uWzYsAFPT09WrVrF5MmT2bp1K926datynuTkZMaMGcOkSZN48MEHr3q7Z82aVSVbID8/n4CAAEaNGoWzs/NVf35RP3q9nujoaEaOHIlWq738AaJJSD81ndhzuRh378bDwZppE0daRigGlej5au5fpJeq+CPdBbhQ1Mg3uAvj+gc2UYuvjXeObgFKGTk4ip6Brvidy+Wr47sBeHDCYEK8HTEaFd45tJESvZHOfW+oNe0xbfsZOHaMyI6+3DS+OwOLy/hi7ibSSlT0GzK8SqX+S1EUhY8+2g4U8cCwLozrUz010fy7NCwynE2/H8Pg4MW4cZENfRvEVSKfeS2D9FPz15R9lLb9DMQfo2t7H8aN60Gu5zn+/dtRsnUXrgSfL1bx4WEt/xgSxCNDO2B1lQvJZRbqUKlUeDhYX37nK3QmqxjDzr+xsVIzbeJYy3KzNWkOv0vTa9gWrz3Bwi0JzIgK5OVxYde8TVfKnIFeF00e/FtbW1tG8iMjI9mzZw/z58/n+eefZ8GCBRw6dIguXboA0L17d7Zu3crHH3/MokWLLOc4f/48N954IwMGDKhSyA/A19eXtLS0KtvM9319fS+5j/nxmtjY2GBjU/2LmlarlT8MzZj0T8sg/XTtHUkxzdfrHuBaZZqUh1ZLN39XDpzL5VRGEfbWGsKd9cRkqknJ07X6fsotMdU18HS2Q6vVEubnioeDNX6udoT7uVouknTyceJAUh4JWSWE+bnWeK7zeaYpBO08HNBqtXi7aOnk48jxtEL2JxcwpmvdhoT+ik/nZEYRtlo1t/Tyv2QfhLZxAeBURlGr76uWTD7zWgbpp+avKfooKde0vn0Hbye0Wi13RwXh6mCDjZWGjl4OONlqeeP3I/wRl8KCTadxd7Tl/kFBlzlrwxWU6pnw8U6s1Co2Pz8UGyvNVXsugMTsitfv5YiNTd0uNjS336UnRoYyNsKPbm1dWuT0jPq8l81u/QKj0YhOp7OkL6jVVZuo0WgwGo2W+8nJyQwdOpTIyEi++uqravtHRUWxZcuWKnMhoqOjCQ0Nxc3NzbLPxo0bqxwXHR1tqT0ghBCt3cGK6v3d2rpUe6zy8jgPDGpPe0dTqn9Dq9S3FGXlRgp1puDfXPDPyVbLpueGsuzh/lW+IJiXCjp2iaJ/57JNf9cC3C9MDevT3lSjZndCTp3atGzPWR76bi8AE3u0xdn20n/wzVkI5/NKLc8vhBCi8ZjXuG/vYfps16hV3NKjLWO6+hLi44Sviy0fT+vFE8NDANNSgHVRpCsnMbPo8jteZM2hVDILdaTmlxKXVPvKPIeS8/jy7wSe/CGWsfO3WpagrS9zsb/ga1Tp/2qw1WqI8HdtkYF/fTVp8D9r1iy2bNlCYmIicXFxzJo1i02bNjFt2jTCwsIIDg7m4YcfZvfu3Zw6dYr33nuP6OhoJk6cCFwI/AMDA3n33XfJyMggNTW1ylz9qVOnYm1tzcyZMzl8+DDLli1j/vz5VVL2n3jiCdauXct7771HfHw8r7/+Onv37uXRRx+91m+JEEI0iYMVXxC6B1QP/m8M9QbAx9mGmQPb4V6R9JSU27qDydwSU6V/tQqc7S4E2U62WuytqybOmdcLPpFWe1X9cznVg/++Qabgvy4V/+etjeeFn+LQGxTGd2vDvyd0uewxLnZaegS4AjD9y91kFOgufYAQQoh6OZNl+mxv73HpSvcTurcBIOZMDrpyw2XP+/SP+xn23iYOnMutV3tWxSZb/r+7hr8tpXoDL6w4yE0f/c1/fj/Cqv3nOZqSz7vrjlGqr7ldiqJwMr0Ag7F6nZ+mqPQvGq5Jg//09HSmT59OaGgow4cPZ8+ePaxbt84yD2T16tV4eXkxYcIEIiIi+Pbbb/nmm28YN24cYBqdP3nyJBs3bsTf3582bdpYbmYuLi6sX7+ehIQEIiMjeeaZZ3jttdd46KGHLPsMGDCApUuX8tlnn9G9e3dWrFjBqlWr6Nq16zV/T4QQ4lor1JVb/nh3a+ta7fHe7d1ZPKM3PzwUhb21Fe42pj/+57Jb98h/TpEpY8zFTovmEnMYAUJ8TCMetY38K4pieb8Caxj5P3w+z5JlUJNjqQUs3HQKgKdGdGLB1J7YWdctlXPR3ZG0dbUjIbOI6V/uJq/E9Lp05YYav8gJIYSom7JyI0kVF3bbe146+O3o5YiXkw26ciOxFavr1KagVM/Go+kYFdhYx0wBgJS8EsvSvAB7EqoG/2eyirjtk+0s23sOlQpuDPXi6ZGd8HW2pUBXzp/x6TWed87qo4x4fwv3frW72gUC81KyHb1a7sj/9aRJ5/wvXrz4ko+HhITw008/1fr4vffey7333nvZ54mIiGDr1q2X3GfSpElMmjTpsucSQoiWpFBXjlpFtZHqyg4l56EopjXhvZxqLjo3PNy0Ioper8e9Yqn7vBI9+aX6y6aet1Q5xaaRf3PK/6WYlzxMzCxCV26oNscys7CMEr0BlQr8XG0t2/1c7fB3syMpp4R9Z3IY0smrxvN/v/ssAKO7+PDEiJB6vQ5fF1uWPNCPOxbt4GhKPiPe34zRqJBVVIarvZapfQOZHtUeXxfby59MCCGERVJOMUYF7LQavGv5+2mmUqno38GD3w6cZ/upLPp38Kh13+2nsiivuDhb0+h9bX7dfx5FAU9HGzILdew9k4PBqKBRq8gs1HHLx9vILdbj7mDNf+/qyaAQTwCKywws2nyKlbHJjOvWpso5V8Ym8fnWBAC2nsjkX0v2sejuSKyt1CiKwqkM09QECf5bhmY3518IIUTjKNSVM+Ttv7h94Y5LjvAeTMoFoJt/9ZT/mthqwM3eFPAnt+J5/7kVwb+r/eUvbvg62+JkY0W5UbHM/6zsbMV8+zbOttUuDPStGP2vPFpTWanewM/7kgCY2q9d3V9AJe09HfhuZl+cba3IKNCRVWR6bbnFej7ZdIpB8/7kyR9i2ZOYjaJINoAQQtRFYpbp876dh32d5osP6GgK+Heeqvnz3mzz8QzL/2PP5tZpmgDAyoqU/yeGB+NgraGgtJzjFRlpK/clk1usp6OXA388PsgS+APc1qstAJuOpZNT8fcBTIMDL/4UB8D4iDbYWKn5Mz6dx77fh95gJKuojLwSPSoVdJC0/xZBgn8hhGilEjOLyC4q42hKPpuO1ZzKBxfm+0f4u9b53G1d7YDWXfQvp9iUHu9eh6WSVCoVnSpG/49XzPuvHEQn1TDf32xomKmmwq/7z2Os4SLN6rgU8kvLaetqx+Bgz2qP11V4G2c2PXcj39zflzVPDGbfqyNZdHckfdu7U25UWLX/PJMW7WDE+5tZGZvU4OcRQojrRWKm6bM96DIp/2ZRFaP9sedyKCmrfX795mMXgn9duZFDybUX7jM7mpJPfGoB1ho1N3dvS692psLm5poyP1VcRL5vYBBtXOyqHNvJx4nObZzRGxT+iEsBIKtQx8PfxaArN3JjqBf/vasnn0/vjbVGzbrDaTy1bD/HU00XFvzd7LDVXt1VBUTjkOBfCCFaqYzCC8Xdluw6W+Wxg0m5vLf+GFM/38n6w6b5hN3rFfybUsTNQW1rlF1kHvmv29JFnSrm/UcfSeOOhdu58d1N5JeaLiDUVOnfbFRnH5xsrUjOLWFnDaP/5pT/KX0DLrl+cl24O1hzQycvwts44+5gzZiuvvz4jyh+fXQgk3v7Y6fVcCqjiKeWHWBXLZkIQgghTM5YRv7rFvy387CnjYsteoNCzJmaV3k5lVFEcm4J1lZqy1SwXQmXT/1ftd806n9jmBcu9tpKq8lkV7kwcFNEmxqPv7WnafR/VWwyKXkl3PnZTpJzS2jvYc+Hd/VEo1YxpJMXC+/uhVaj4veDKTy34iAgKf8tiQT/QgjRSmVWquz+17F0S6C+7WQmt3y8jY/+PMn2U1mUGYwEeTrQq51rnc/t73bpkf9CXTk5RWUNTiHPK9Zz6yfbmLvmaJOloeda5vzXraZBp4qK/78dOM/eMzkkZhWz4Yjpwoo57T+whuDfVqthQnc/AFbEVB1xP5FWwJ7EHDRqFZN6BzTshdRBhL8rb9/Rnd0vD+eWHqa2zFoZV2vlZyGEuB4pisKW4xkk55r+9iVYKv1X/2yviUqlsoz+bz+VWeM+WypS/vsFuXNDRfB/ceG+i+kNRn6JPQ9cCOLNwf+exGzL1LFhYd61XtC+uYcfKhXsPZPDrR9v52R6Ib7Otiy+tw8ulVa8GR7uw0dTTBcDzO9DsAT/LUaTFvwTQghx9WQWXpi3pyjww+5z/GNoR55fcRBFMc09HB/Rht7t3AnxdqzXqLI5+K9p7fhTGYWM/+9WSvVGrDVqvJxs8HKywdvJBg9Ha9QV8yJ7Bbpxe6R/jedfeziF2LO5xJ7Npa2rHdOj2tfjlTcOc9p/XUf+w3ydLf/3cLAmq6iMDUfTuK2Xv6XSf4C7XY3H3hHpz9JdZ1l9KIXZt3TBqaKI4ve7zwEwPMwbH+erX5DPyVbLf27uyraTWZzOKOKTv07y9KjQq/68QgjREvyw5xyzfo7D2daKpQ/2t4z8X67Sf2VRHT34OTa51jov5vn+N3TystSE2Zt4oXBfTVbHpZCaX4qHgzVDK5bn7RHgilajIi1fZ/lbcmvF3P6a+DjbMrCjJ3+fzCQ1v5QOng58O7Mv/m7VL2yM6dqGD+5UePKHWIwKBHtL8N9SSPAvhBCtVGZF2n97D3sSs4r5Yc85Mgp0JOeWEOBux+fTe+Ng07A/A5ea8//djjOU6o0AlBmMJOeWWEYHKluy6ywhPo411hrYdvLCl6L//HaE8DbOllGM+vpi62kcbKyY0jewXseZR/7rMucfTKM0jw8Lpp2HAx29HZn48TY2H8tAV2645Mg/QM8AVzp4OXA6o4g1calM7hNAqd5gmaM5pV/92n4lXOy1zL65C48s3cfCzae4qbufJatBCCGuV+n5pcxZfRSA/NJy7lm8i/xS0xKt7euY9g+m4B9M9XYKdeU4WGvQGxSsrdSU6g2W6V83dPIiyNMBRxsrCnTlxKfm08WvemFeRVFYtPk0APcNbG+Ze29nraFrWxdiz+ZSqCvH1V7LjRUXBmozpW8gf5/MpIufM9/c3xdPx9pXMLi5ux82VmrWHU5lXC1TCUTzI8G/EEK0UlkVwf+k3gF8vT2RjAIdy/aarv7Puz2iwYE/gL8l+K868l9SdqEy/RfTexPWxon0Ah3p+ToyCkrJKdajKKZ0x10J2by7/jjf3t+3yjkURWF7RSXkMF8n4lML+Of/9vH7Y4MuuRzdhxuOk5RTwrzbIyyjI0k5xfzfH6Yva/07eNS5KBNcGPmva9q/Wq2yjJIbjQreTjakF+j4+0QmKXkVI/81jKCAKRX0jkh/3l57jBUxSdwe6c+X2xLIK9HT1tWOISE1LwF4tYzr5suIcG82HE3nxZ8OsvwfA2odcRJCiOvB7N+PUFBaTte2zmhUKg5UFMu11arxcb70Mn+V+bvZE+Bux7nsEgbM3UhxmYFyo8KgYE96BLiiKzfi52JLsLcjKpWKXu3c2HI8g90J2TUG/1tOZHI0JR97aw1396+6Ikzf9u7Ens0FYEKEH9ZWl57xPa6bL388Pohgb8dqK9PUZHQXX0Z38a3zaxdNT+b8CyFEK2VO+2/jYsudleaL390/kAEdG141Hi6sVZ9fWk5eid6y/Y+KyvT+bnYMC/PG382eXoFujOnqyz1R7Xl8eAhPjAjhnTu6Y6VWWb7QVHYivZDMQh22WjU/PNSfMF8nMgt1PP3j/lrbk1eiZ/7GE6yISeJAxdKFgGX9YYAlO8/U6zXm1LPgX2VqtYrh4T4AfLvjDEYFbKxMUyBqc1tPf9Qq05rOw97bxNtrjwGmQn/XOvBWqVT855auOFhr2Hc2l3u/2m3JJBFCiOvNxqNp/HEwBY1axVu3RfDt/f3o2tY01SvI07FOy/xVNrqzKWDOLy2nvGKVl79PZrLgr5MA3BDqZTlnv6ALc/dr8unmU4Bp1P7iv1eVM+Zuu0TKv5lKpaKLn0udAn/RMknwL4QQrZQ5WPN0tGFKv0AcbawI8nTgxbHhV3xuBxsrPCrS4ZMrpf5fqEwfeMkaAoEe9kzuY7og8e76Y1WK+m07aSqC1Ke9O6721iyY2hOA7aey0BuMNZ4v9mwO5lMcOJdr2X46o9Dy/+UxSbUWsMsuKiM+Nb/KthxLwb/6B/8AI8JN6ZXm+ZsB7pdeB9rXxZZBFSP8Z7KKcbXX8uSIEP5xQ8cGPf+V8nO1491J3bHVqtl6IpOx87fKCgBCiOtG7Nkc3o8+zpM/xFqq2s8cFETXti642Gv57v5+zIhqx6yxYfU+9wtjw/jlkYGsfXIwO2YN469nh/LQkA4425oy8sxFYIEqVfsvLoB7MCmX7aeysFKruH9QULXn6dfBnbaudvTv4E6PANd6t1O0PpL2L4QQrVTl4L+tqx2bnhuKrVaD4xWk+1fm72ZHVlEZSTnFdPZz5lhqATFnKirT11LIr7LHhgWzIiaJ3QnZbD2RaVnSyDzf35yd0MHTEY1ahcGokFNUhncNhe/2VVoy6WDShfWQT1ca+c8r0fP7wRTuuKhtpXoDt32yjcSsYoaHefP8mDC+3p5ATrEejVqF9yVG6y9lYLAntlq1pf5BbfP9K3txTBhqFQwO8eKuPgFXNDWjMYzt1oaO3o48smQfJ9ILmfHVbv43sx+9G1h/QQghWoIiXTnTvthFcdmFC8ZBng48OSLEct/NwZrZt3Rt0Pm1GjXdLwrGXxoXzpMjQsguKqtSZC/C3wVrKzWZhWX0m7ORDl4OBLrb4+FoY1kF4ObufpZaPJU52Wr5+4UbURTqnZ0gWicZ+RdCiFbIYFQs69R7OplGrj0dbRot8AcsX07OVYz8m0f9R4R71xigX6yNix139zPNT3xrTTylegPlBqNldHlgsKkoklqtsoy+V17BoLKYsxeC/8oj/wmZpuDfXIn4fzWk/n+x9TSJFcs1bYxPZ/SHW/h+9zlUKtOXMbc6Fvy7mK1Ww+BKc/UD3Gqu9F9ZZz9nvr6vLzMHBTV54G/WyceJXx8dxNBQL0r1Ru77eg9Hzudf/kAhhGihthzPoLjMgLeTDS+MCeOTab347bFB2Ftf3c9le2uratX1bbUay0Xr9AIdO09n8+PeJBZuOsXeigvfD93QodZzqlSqeq3mI1o3Cf6FEKIVyi4qw6iASgXuDUxbvxzzcn9JOcWU6i8U+pvar92lDqviXzd2xMnWiiMp+Tz2fSwHknIp0JXjbGtVpbCRp6PpNWQVVZ93Xm4wWgoaAZzOLCKvolifOe3/2VGhaDUq9p/L5VDyhcyAtPxSPtlkmi/53OhQy5rKLnZaSxB+JUZWzPsHU9p/S2VnrWHhtEj6tHejoLSc6V/utlxYEdcPRVEwGpXL7yhECxd9JA2AW3r48c+hHRnXrU2jXjyvrzm3duPAa6NY+a8BvDepO8+O6sS9A9ozobsfr0/oXGWpWSEupXkMKwghhGhU5pR/N3trrDRX5zqvf0Uwm5RTwoqYJPJLy2nrasfg4LoXE/R0tOHz6b2Z/uVuoo+kcbCiWF9UR48qRe48zMF/DSP/8akFFJcZcLK1wsVOS1JOCQeTc4ls58b5vFIA+ga5M6ZrG347cJ4lu84w97YIAOatjae4zECvQFf+NbQjj9wYzMGkXNq42F2yOF9d3RjmjUoFitKyg38wXQD4YkYfpny2kyMp+dz9xS5WPz4YlzquhiBatlK9gfH/3YqtVsMvjwy8ap8rQjS1coORP4+lAzCyc/OpZO9ir6VnoBs9A92auimiBZNPbiGEaIUuzPe/OqP+cGHkf/OxDF5ZdQgwVaavb3ph/w4eLJjSE7UK0vJN7R540QUEDwdTIF5TxfmYirTHXpW+FB1MyiMx05TK72qvxd3Bmrv7BQLw875kPtp4gi3HM/h5XzIA/57QxTIfMsLftVECfwAvJxvGd2uDq72WyHYt/wubi52Wb+7vS4C7Hcm5Jfx6ILmpmySugrJyIwWl+irbdpzK4lRGEYfP57PzdM1Vx81OZRSSKJkhooXak5hDbrEeN3stvQJdm7o5QjQqCf6FEKIVMo+Qezo2ThBbE/Mc9jKDEbUK7uoTwAODa593eCmjuvjy1u0RlvvVgn9L2n/1kX9z8B/Zzo3u/qapAvvP5XI605TyH+TpAJhG/wcFe6IrN/Je9HGmf7kbMC1/dHHhpcY0/66e7Htl5FXti2vJy8mGaRVTO6KPpjf6+eNT87ln8S7+PpHZ6OcWdXPP4l3c8M4m0vJLLdvWV6RBA/x+8Hytx8an5jP6gy0MfXcTN7zzF78eqH1fIa6GtPxSNh1Lr1YZv67MKf/Dwnwkw0W0OpL2L4QQrVDlSv9XSwdPR8Z3awMqeGJ4CJ18nK7ofJN7B+Bsq6VIV05HL8cqj5mXFcyuIe2/cvBvY2X6orb/XC7d2rpY2gmmokdf39eHP+JSWLjpFPGpBThYa3hhTP2XaaoPTSsstDQi3Ie31sSz41QmBaV6nGwbJ/W/SFfOP/+3j4TMIqzUKgaF1H0KiWgcpXoDuxOzURRYEZPEIzcGYzQqbDx6IfhfcyiV/9zSFWur6oHR0l1nLeuWn8kqZs4fR5kQ0UYqjYtrorisnMmf7uRMVjHvTerO7XVYeaYyRVGIPpoKwMjOPpfZW4iWRy5nCSFEK5RxDYJ/tVrFx9N68fHUXlcc+JuN6epb45c1j4rXcXHBv9S8UpJzS1CroHuAK138XNCoVWQU6Nh+yjRy3MHLwbK/lUbNLT3asuaJwSx7qD+/PDoQnzqsTCCqCvZ2pIOnA3qDwpbjjTdCP/u3w5ZCgicrijWKays5twTzgOnyvedQFIW45DzSC3Q4WGvwdLQhr0TPtpPV+z2rUMfKWNNUkE+m9cJWqyY1v5TjadKX4tp4N/okZypWb3ln3TFKKi3V9/FfJ3ns+1iKdOW1Hn8srYBz2SXYWKkZ0kkuPorWR4J/IYRohTILqi7z19KZR/4vXurPPOof5uuMo40VdtYay4WIXRXrH3esFPybqVQq+nXwINi7cS5aXI9GVIyKRR9JbZTz/X7wPD/uTcI8QJyUU1Lli7u4Ns5mF1v+n5hVzJ7EHDZUjPoPDfVmfDdTAbTfKqXz68oNfLblFEPf3URBaTkB7naM6eJL/w6m5To3H2/86SFCXOxEnorvdpqWnHW115KaX8riv08DsPZQKu+sO8ZvB87z340naj3H+sOmn/VBwZ5XfVk/IZqCBP9CCNEKWdL+HVrHPPPaRv7NwX/v9heK6fUIMKX7m0cvgzyrTiEQjcOcEvtnfDp6g/GKzpWUU8ysn+MA+NfQjrg7WKMopsJx4to6Vyn4B/hx7znLHOgRnb2Z0N0PMNUAKNUbOJqSz6gPtjBndTwFpeV0buPMwmmRqNUqy9KZm49nWM6XW1zGs8sP8Fe8XBAQjadIV873p0xhzZS+Acy+uQsACzed4lByHi/+fNCy7+K/EziWWlDl+CPn83lpZRwLK5Z+lZR/0VpJ8C+EEK2QJfhvJSP/nrUs9bf/3IVK/2bd/V0t/1epoJ1Hy15ir7nqFeiGu4M1+aXl7Em8dPX3Syk3GHlq2X4KSsvpEeDKkyM6EVxR8+FkugT/19rZipTpHhVFMH89cJ741AI0ahU3hnrTK9CNNi62FOrKmbv6KHcs3M6ZrGK8nWx4544IfntsEF0r6m2Yg/89CTkUl5lSrT/68yQrYpJ4+LsY9l7Bz40QZrsTsnngu31k6VT4udjy0rhwJkT4EeHvQlGZgdsXbie3WE+3ti6MCPem3Kjwyqo4FEUhvaCUB77Zw7j/bmXprrOU6A30CHBlfESbpn5ZQlwVTRr8L1y4kIiICJydnXF2diYqKoo1a9ZYHk9NTeWee+7B19cXBwcHevXqxU8//VTlHNnZ2UybNg1nZ2dcXV2ZOXMmhYVVvywcPHiQwYMHY2trS0BAAG+//Xa1tixfvpywsDBsbW3p1q0bq1evvjovWgghroFrUfDvWjKP/BeXGSxBhKIoluAw1PdC+n7lyv3+bnbYajXXrqHXEY1axbAwbwDeX3+82tJwdfXxX6fYk5iDo40V/72rJ1qNmmAfCf6bypmKkf9be7alg6cDZeWmrI4+7d1wtbdGrVZxU0Vg9M2OMxSVGYjq4MH6p4YwqXdAlQKXQZ4O+LvZUWYwsvN0FtlFZSzdZUrLLjMYeei7GM5kyZKAomHOZRcz5bOdTP50B3vP5KJRKbx1WxecbLWo1SpeGhcOgK7ciJ1Ww4d39WD2LV2x02rYk5jDK6sOMebDrWw4mo6VWsX4iDZ8/2B/Vv5rQKMVMRWiuWnS4N/f35+33nqLmJgY9u7dy7Bhw7jllls4fPgwANOnT+fYsWP8+uuvxMXFcdtttzF58mRiY2Mt55g2bRqHDx8mOjqa33//nS1btvDQQw9ZHs/Pz2fUqFG0a9eOmJgY3nnnHV5//XU+++wzyz7bt29nypQpzJw5k9jYWCZOnMjEiRM5dOjQtXszhBCikRiNyjVZ6u9acrDWWCqLm19bTrGe/FLThYD2Hhfm9Yd4O2KrNe0rKf9X18xBQTjZWLH3TA53f7GL3OLqqzFcyt7EbOZvPA7A/03sSmBFlkaIt6nfTqQX1HqsuDrMaf+BHvZM6h1g2T4i/EIatDn1H+DO3gF8c39fXO2rZxmpVJVS/49l8PX2REr0Bjq3cSbC34XsojLu+3oPecUNu3DUnBiNDVtWTjTcK6sOseN0FlqNirv6+PNKT9OFKLP+HTxMK9IAr9/cmY5ejrR1tePJESEALNl1luyiMsLbOPPH44P5eGovojp6yMoUolVr0uB/woQJjBs3jpCQEDp16sSbb76Jo6MjO3fuBExB+WOPPUbfvn3p0KEDr7zyCq6ursTExABw9OhR1q5dyxdffEG/fv0YNGgQH330ET/88APnz5sK0SxZsoSysjK+/PJLunTpwl133cXjjz/O+++/b2nH/PnzGTNmDM899xzh4eG88cYb9OrViwULFlz7N0UIIa5QfqnestSWh2PrSPtXqVR4mpf7KzIFmAmZplFhPxdb7KwvjO5badSVlvmrXuxPNJ7wNs4sfbA/bvZaDiTlcddnO8kq1F3+QCCvRM8TP+zHqJhGmSf2bGt5LNhbRv6bgqIoloJ/7dztua1XWzRqFSoVjOrsa9kvwt+Vf0/ozNt3RPDW7d1qXPLPzBz8bziaztfbEgB4bFgwX0zvTRsXW05nFPHQd3sp1bfc4o5JOcUMfvsvpn2xs94XwETDJOeWsOWEqZbEb48N4o2bO+New7Xu9+/szubnhnJnn0DLtvsHBdG1rTMqFTw8pAOrHhlQJXtMiNas2ZSxNBgMLF++nKKiIqKiogAYMGAAy5YtY/z48bi6uvLjjz9SWlrK0KFDAdixYweurq707t3bcp4RI0agVqvZtWsXt956Kzt27GDIkCFYW1/4Ajx69GjmzZtHTk4Obm5u7Nixg6effrpKe0aPHs2qVatqba9Op0Onu/AFJz8/HwC9Xo9e3/KvYLc25j6RvmnepJ8aR0qOKY3W2dYKtWJEr7+yYmyVNWUfuTtYcz6vlLS8YvS+DpxINX3utvewr9aeCRG+7EnMYViox3X583Qt+ynMx54l9/dhxtd7iU8tYO7qo8y9tctlj/tm22mSc0sIcLPj1XGhVdra3t20/GJiVjFFJbpLBpctWXP7zMsq1FFcZkClAm9HLTZWaj6d1oNSvZE2ztoq7by7r2lJzvLy2pdNA+jTzgUrtYrk3BIAOnjaM6yTB2q1is/u7sldX+xmV0I2jy3dx3/vjMBK0/z6+nL99NbqoyTnlpCcW8Kdn+7gqxmReDm1jqyr5mrZrjMoCvQPcqOjh12tfaQG/Jytq21fen8fCnTleDvZQCP/nRS1a26fea1Ffd7PJg/+4+LiiIqKorS0FEdHR1auXEnnzp0B+PHHH7nzzjvx8PDAysoKe3t7Vq5cSXBwMGCqCeDt7V3lfFZWVri7u5OammrZJygoqMo+Pj4+lsfc3NxITU21bKu8j/kcNZk7dy6zZ8+utn39+vXY20txqeYqOjq6qZsg6kD66cqcyFMBGmzRX7X6JU3RR4ZiNaDmrx17KTmlsOGs6b66KLPa63RW4MP+kBO/i9Xx17ypzca17Kep7WD+YStWxibRjTO4Xib2+SlOA6gY4FbI1j/XV3lMUcBGo0FngP+tWotvHf6sppXA8tNqQlwURvu3rBTs5vKZl1gAYIWLVmHj+rVVHlt9puHnbe+o5mS+Kajv71LA2rUX6jvd11HFwqNqoo+mc/8n67mzg5G6ZF1n6+BAlgqtGmw14Gmr0P4qD97W1E9nCuH3OCtUKDhYwbG0Qm7+7yYe6WyocSS6tSozwOkCFSfzTbfzRRDgqDDIR6Gbu0JjXr8zKvC/WNPnR4im6ud/c/ldEpcm/dS4iouLL79ThSYP/kNDQ9m/fz95eXmsWLGCGTNmsHnzZjp37syrr75Kbm4uGzZswNPTk1WrVjF58mS2bt1Kt27dmrTds2bNqpItkJ+fT0BAAKNGjcLZ2bkJWyZqotfriY6OZuTIkWi1UsSluZJ+ahx/xKXCkYO083Vn3Lg+jXrupuyjTaWHOBp7nrYdwhg3JIg/vt8PyencEBnOuKh217QtzV1T9dP2xXvYk5jDGduOTB0bCsDBpDxe++0IDw0KYlzFGvEZBTrO7NgMwON3DDONvl3kq6RdHEjKo01YL8Z29a32uKIolrm5h5Lzef3bGHKK9ZzIh5uH9GB4mHe1Y5qb5vaZ9+uBFDgURye/xv3sOOeYwLvRJ2jjYsvLdw+qlskRdjiNx5cdYEe6mn7dOvHI0A6XPef938Sw9UxWlW1LZ/ahT6VlPxtLbf2kKArTvtwL5DCxhx+P3NiRe7/aS1JuKR8ds+PBQUFM6eOPg82Fr9sJmUVsiE/nwLk8uvg5M76bL4HuLXvQ6HxuCfd8tZez2SVVtpsuBJimX/3v/t6Nlg3x98kssnfG4GRrxfNTh2Or1TS73yVRM+mnq8OcgV4XTR78W1tbW0byIyMj2bNnD/Pnz+f5559nwYIFHDp0iC5dTOmD3bt3Z+vWrXz88ccsWrQIX19f0tOrrhNbXl5OdnY2vr6mLwq+vr6kpaVV2cd8/3L7mB+viY2NDTY21T/EtFqt/DA3Y9I/LYP005XJKTGl4Xo52Vy197Ep+sjLyZQKnltSjlar5UyW6YtmsI+z/LzU4lr3079uDOa+r/bww94kHh/RCUWBx344wPm8Uj7YeJKbe/qjUqn4+5Qpsy7C34W27jUXZQzxceJAUh4JWaWW11BQqmfprrN8vT2RQl053f1dCfN14oc95yjUleNkY0WBrpxXfjlCnyBPyyoRzV1z+cw7n2eaztjOw6FR2zN9YBDnckq5rVdbHOyq98lNPfzJ1xl5aWUc8/88SZ8gDwYGe9Z6vlK9gV2JpmU+bwz14kR6IUk5JWw9lc2AkKt30efiflp/OJU9iTnYWKl5bkw4fq52rPjnQGZ8uZtjaQXMW3ecT7cm0M7DgewiHTlFegp1F6ZJrDuSzvsbTjKqsw8LpvZqkdNbTIF/DGezS/BwsOaGUC/6B3kQ1saJDUfSWLLrLKczi7j/230sezgKF7sr/7n6KdZU1+vWnm1xsret8lhz+V0Slyb91Ljq8142u08Zo9GITqezpC+o1VWbqNFoMBpN83KioqLIzc21FAAE+PPPPzEajfTr18+yz5YtW6rMhYiOjiY0NBQ3NzfLPhs3bqzyPNHR0ZbaA0II0ZK0tmX+zDwqCv5lFZVhNCokVCwRJkX9mo+hnbwIb+NMcZmBr7cn8sxyU+APpvn7sedyAdhw1HTBfXiYT22nslT8P5lRiNGo8NmWUwx860/mroknJa+UgtJy/j6ZyRd/J1CoKyeqgwebnhtKJx9HMgvLeHnlIRSlZaX/NzVLsT+Pxh2JdrbVMu+OCPpVqsR+san9ArmrTwCKAk/8EEtafmmt++47k0NZuRFvJxu+vLcPT47oBMDO01m1HtOYSvUGftmfzOzfjgCmVS/8XO0A8HWx5ffHB/HOHREEeTqQW6znwLlczmWXUKgrR6tRMTjEk2dGdmJQsCdqFaw/kkb0kbRLPWWzlJJXwpTPd3I2u5h2Hvb8/vgg3p/cg8l9Aojwd+XpUaH8/K8BeDnZEJ9awP1f77Es1dpQ53NLWH/Y9F5NrrQahRCibpp05H/WrFmMHTuWwMBACgoKWLp0KZs2bWLdunWEhYURHBzMww8/zLvvvouHhwerVq2yLOkHEB4ezpgxY3jwwQdZtGgRer2eRx99lLvuugs/P9MyNFOnTmX27NnMnDmTF154gUOHDjF//nw++OADSzueeOIJbrjhBt577z3Gjx/PDz/8wN69e6ssByiEEC1FZkHrWubPzDyKm1VUxvm8EsrKjWg1KtpWfOkWTU+lUvHPoR15/PtYPvrzJAajgrWVafWFmDM5rNyXTOc2zvx9MhOA4eG1j9KaK/4fTs7jH/+LYX1FcNTRy4F/3NCR8DbOHEzK48C5XJxsrXh2dCi2Wg3vT+7BxI+3sfZwKqv2J3NrT/+r/8JbCXPwH9BEaeiv39yF/edyiU8t4LHvY1n6QL8aCwBuO2X6+RkY7IlKpaJfkDsAcUl5FOnKq6TZN7aFm07xyV8nKagYwfdxtuEfQztW2UerUTOpdwC39fJn28lMSvUGPBytcXewwcfZBntrU/seA95ZF8/Hf51i2d5zjI9oc9XafTW89HMcZ7KKCXC34/sH+9PGpfpncTsPB76b2ZfJi3YQcyaHh7+L4fPpvbHVamo4Y+3Kyo18tS2Bj/48SZnBSNe2znStWNVFCFF3TTryn56ezvTp0wkNDWX48OHs2bOHdevWWeaBrF69Gi8vLyZMmEBERATffvst33zzDePGjbOcY8mSJYSFhTF8+HDGjRvHoEGDqgTtLi4urF+/noSEBCIjI3nmmWd47bXXeOihhyz7DBgwgKVLl/LZZ5/RvXt3VqxYwapVq+jates1fT+EEKIxtNqR/4plC7MKdSRkmkb9A93tm2V18OvZuK6+tPOwx1Cx3OTrE7rwxHDTutq/HTzP1hOZFJcZ8HW2pYtf7TVyQrxN1dtOZxax/kga1ho1b97aleinbmBS7wC6tnVhar9A5t0RwSs3dbYEE13bulie76ONJ6/mS211zMF/U81Bt9Vq+GRaLxxtrNidkM1//6y5/7adNI3wD+hoyiQIcLenrasd5UaFmDM5V619O09nM29tPAW6ctq62vH48BB+fXQQzrY1p9xq1CqGdPJiVBdfItu5E+TpYAn8zcyj11tPZFhWRKgrRVGaLLslJa+ETcdNS+19dW8fS+ZDTcJ8nfnqvj7YaTVsPZFZ7wyA5NwSxny4hblr4ium+7jw4Z09rvQlCHFdatKR/8WLF1/y8ZCQEH766adL7uPu7s7SpUsvuU9ERARbt2695D6TJk1i0qRJl9xHCCFagswi88i/9WX2bFk8HSpG/gvLLMF/kGfN88VF07HSqHlieAhP/3iA23q1ZUrfAAxGBS8nGzIKdMxZfRSAYeHeloJ9NWnrZoetVm1aZs7FloV3R9IjwLVObbizTwDvRR/nTHYxeoMRrVwguqxSvYHUilT7pixA18HLkTm3dePx72P5+C/TfPjKI7z5pXoOJuUCMKBSXYB+Hdz5eV8yuxKyGNLJq9HbZTDC7N9NP7tT+gbw5sRuqNV1WJbgMtp5OBDVwYMdp7NYvvecZQpDbTYdS2dVbDKnM4tIyCjC3kbDin8MuObZGj/vS0ZRoG+QO8Hel19mIbKdO9/c35f7vtrN9lNZ3PvVHhbP6I1TLRdOKnt7bTynM4vwdLThhTGh3N7Lv1HeeyGuR/LXUAghWpBvdyQy6+c4jMbaR3syCypG/lvZOtOWkf8iHaczTMF/Ry+Z798c3dbLn63P38h7k7qjUqmw0qi5pbtpOp75ws3lqvFr1CpeGBPGbb3a8ttjg+oc+IOp2KWNlRqDUSElt/a54+KC5NwSFAUcrDW4OzTthcObu/sxvlsbDEaFp3/cj67cYHls1+lsjAq097CvMuWnf0U9gZ2ns69KmzanqjiZUYS7gzUvjglv1ODzzj6m0f/le5Mu+dm+OyGb+7/ew6r95zmYlEeBrpy0fB0vr7q29S0URWFFTBIAkyLrPq2mb5A7387sh1NFZkfkGxuYtGg7b6+N54fdZ1l3OJXYszlVXsvxtAJ+PWAq8PfN/X2Y1DtAAn8hroAE/0II0UKUG4y8+cdRvt99lkPn82rcZ9OxdJJzS9CoVS1++aiLmQMSvUHhQMXIX5AU+2u2Atztq4zs39qrreX/tlr1Jau5m903MIj3J/eo9xQWlUplGQk1p7KLS6s83/9SGRnXyhsTu+LpaM3xtEI+3HDCsn17xXz/ARf9/PQPMgX/B5Nyr7io3MVOZxSx9pzpK/MLY0JxsW/cKuVjuvriZGtFcm6JpZ7BxXKKynjih1iMCowI92bR3ZF8N7Mv1lZqthzPYNX+5EZt06XsO5tDQmYR9tYaxnWrX52CyHZu/O+BfgS421FmMLInMYdPNp3ixZ/jePi7GG79ZDsPfrsXvcFU3PvDDcdRFBjb1ZcufjLHX4grJcG/EEK0EKcyitCVm74Q1RTQ6MoNlurT9w5o3+rm/NtqNThWFPI6lGy6+CHBf8vRuY0zoT6m9OCBHT3rXfCrvgLcTKPC53Ik+K+Lc1ep0n9DuTtY838TuwHw6eZT/BlvKvi4vWK+/8COVYP/AHc7/Fxs0RsU9p3JbbR2xKfmM3XxHnRGFT0DXJgU2fgV5m21Gib2MF0cW7bnXLXHFUXh2eUHSMkrpYOnA/Pv6smYrr4MDvGy1Lf4z29HyCrUse9sDs/8eICpn++sdw2BujKP+o/t2qZBxRW7B7iy5bkb+evZobx9ewR39QlgWJg3PQNdsbZSs+FoOs+vOMih5DxWx6WiUsFTIy89HUIIUTcS/AshRAthDnih5uB/8d8JJFTMi3xiRMi1bNo1Y0791xtMaaFBkvbfYqhUKh4dFoyTjRUzBrS/6s8XeAUj/3+fyLzkUnOt0dmspi32V5MxXX25rVdbjAo8+G0Mizaf4lhaAQBRHasuG6hSqSxLCe48nUVucRkPfruXWz/Z1uBMgLikPO76bCdZRWW0tVdYOK3nVUs5N6f+rz+cxq8HzltS3/UGIx9sOMHG+HSsrdR8NLVnlYD7oSEdCPN1IqdYz43vbuK2T7bz074ktp/K4ull+y2FNxtLSZmB3w6kADCpd8NX0lCpVAR5OjC5TwBv3R7Bl/f2YeW/BrLo7l5o1CpWxiZz9+JdAEyI8KOTz+XrCgghLk+CfyGEaCEOn8+3/P9cdtURnZS8Ektl85fGhdVafbql86g0F9nRxgqvVpbd0NpN6O5H3OzRV6Ug28XMaf/n6hn8bz2Rwd2Ld3HbJ9vJL9VfjaY1O4qiEHsuF2i6Zf5qM+/2CG7r1RaDUeGtNfGAKYukproE/TuYlvxbeziVWz7eRvSRNGLP5hJdsUxkfcScyWbq5zvJLdbT3d+FR7sYqnz+NLaubV0YHOJJmcHI49/Hcs/i3SzddZaR72/mvxtN0x5eGR9eLfVdq1Hz1u0RqFWQX1qOjZWaiT38sLfWsCshmy+2nm7Udq47nEqhrpwAdzv6tndv1HMDDAvz4Z07IgDILdajVtFqL2YL0RQk+BdCiGZIURSij6RVGX08XGme/8UBzZzV8ZToDfRu58atPdvSWnlUCvaDPB2axdxk0Tw1NPj/ca8ppTk5t4R//3K40dvVHH29PZGYMznYWKm54RpcmKkPrUbNe5O686+hHS3bBlw06m/Wr2Le/8n0Qs5kFaOpGKU3j1TXVVp+Kfd9tYcCXTl9g9z5+t5I7K/B+lhfzOjN0yM7YW2l5u+Tmby0Mo7ErGI8HKz5zy1duKd/uxqP6xHgyhczevPGxK7semk4H97Vk9du6gzAu+uPcaTSheOGMhgVfth9lv/7wzS17GpW3L+tlz+v3dQZlQqm9guko5es6iJEY2nSpf6EEELUbP2RNB7+LoY+7d1Y/o8BGI1KlS9wlVOZy8qNrI4zfbn994QurTogrjzyJvP9xaU0JO2/oFTP+sOplvsrY5O5McybmytWKmiN4lPzmVsxov7y+HDaeTS/3yuVSsXzY8Lwd7Pnp31JTOkXWON+7SpWAEjOLaFvkDtPjejElM93svl4OnnF+joV6lMUhVdXHSK/tJxubV345r6+WKmMjf2SamRjpeHx4SHc3N2P1387TFxSHvcNbM99A4MuO7d+WJhPlft39glgw9F0NhxN48llsfz66KBa62wYjAoqsATzptT+82w+noHBqKBWw4m0Qk6kFwLQwcuBu2u5ENFY7h8UxITufk2+8oQQrY0E/0II0QyZ01T3JOZwLrsYo6JQoLswb/V8bgnlBiNWGjVns4sxGBUcbazo2ta5qZp8TZjn/IPpC6gQtTGP/OcU6yko1ddpPfE1h1LRlRvp6OXA+G5t+O+fJ3llZRy927nhV2lZuZYmNa+UPYnZjO7ii7XVhaTPUr2Bx7+PpazcyPAw71pHlpuLqf0CmVpL4A+miwT/ndKTuKRcpvZrh7WVmk4+jhxPK2TdkVQm9758sb41h1JZfyQNK7WKt++IwM5ag15/bYJ/s/aeDnx9X98rOodKpeKt27sx5sMcjqcVcsuCbdzZJ4CJPdtaAupyg5Gvtycyf8MJDIpCJx8n/N3s2HI8g/zS6nUSXOy0PDYsmOlR7av8HF0tXq1suVohmgMJ/oUQoplRFIXNxzMs9389cJ72FaNxXds6czy1kDKDkZS8UgLc7TmdYRqNuR7S4D0cqqb9C1EbRxsr3B2syS4q41x2CZ39Lh/8r9xnWi7ttl7+PDSkA5uPZ3AgKY9nfjzAkgf6tcj1xYt05Uz6dDvnsk2j4Qun9cLD0Yb8Uj2vrjrE8bRCPB1tmHdHRKv4/Ihs50ZkOzfL/QkRfrwXfZzfD6ZcNvjPLS7jtV8OAfCvoR0Jb9OyL6Z6Otrw3uQePPzdXo6lFfCf348wd81Rhof5MLKzD19vTySuUiHZ/edy2W+p/WDHpMgA3B2sMSoK1ho1Y7r64movI/FCtGQS/AshRDNzNKWAjAKd5f5vB84zLMwbgG5tXSjSGUjILOJcTjEB7vYkZBYB10cwXGXk31PmgYpLC3C3NwX/OcV09rt0IHc+t4SdCaZl5G7p4YdWo+aDO3sw/r9/s+N0Fov/TuDBIR2uRbMb1ZzVRy0FQncnZHPzgm3c3b8dX2w9TVZRGQDvTopodUuDmt3U3RT8bzuZSVahrkrdkMpOphfw2Pf7ySwsI9jbkUeGBV/jll4dN3TyYues4fx64DzL9yYRl5zH2sOprK2Y3uJsa8VL48Lp3d6N+NQCEjKK6NrWhRs6ebXIi11CiEuT4F8IIZqZLSdMo/6R7dw4mJRLfGoBxWUGALr4uZCcW2oK/rOLoSPXVfBfOUBp79m8qpKL5ifAzY4D53LrVPRv1f5kFAX6Bbnj72b62erg5cirN3XmpZVxvLPuGINCPFvUaPDm4xks2XUWgDdv7coXW03Lgc5ba5rj38HLgX9P6NLsivw1piBPB7q2deZQcj5rDqVWm6uuKArf7z7Hf34/TKneiLuDNR9M7oGNVc3z41siV3trpke1Z3pUe+JT81m+N4lNx9Lp2taFl8eF4+1sC0CwtyynJ0RrJ9X+hRCimdl8zBT839zdz/Kl3Fy0rIufMwFuprnH5tG80xXB//UwBz6gIigLdLev0xxucX0LrGPFf0VRKqX8V10tY0rfAEaEe1NmMPLkD/sp1RuuTmMbWV6JnhdWHATg3gHtmdavHav+NZAR4T54Olrz2k2dWffkkFYd+JtNiDAVbPztwPkq29MLSnn4uxheWhlHqd7I4BBP1j4xmG7+LjWdplUI83Xm1Zs6s/GZocy/q6cl8BdCXB9k5F8IIZqRQl05e89kAzCkkxeu9lo2HE0HQK0yfXG7uIq5eeT/ekiDD/Sw56t7+7To4mvi2gmoY8X/XQnZnEgvxMZKzdhubao8ZiqcFsGYD7dwLK2Aoe9sYli4NyPCvRkY7NlsR4jfW3+M1PxS2nvY8/yYUABc7LV8MaM3iqK0ivn9dTU+og1z18SzKyGbaV/s5PnRYZzOLGT2b0fILdaj1ah4fnQYMwcFSaq7EKJVk+BfCCGakR2nstAbFALd7WnvYY+Psw12Wg0legPB3o7YWWsurF+eU0xBqd5SH+B6SYO/saL+gRCXU5fl/oxGhTmrjwJwR6Q/zjVklHg62vDhnT3555IYUvNLWbrrLEt3nSXM14mf/jngssuwXWu6cgMrY02ZDP+5pSv21lXbdz0F/gD+bva8MCaMD6KPs+1kFrec3GZ5rIufM2/fEUEXv9Y72i+EEGaS9i+EEM3Ilooq/zd08kKlUmFvbcXwcFOwa/5yWjmVOTHTFNR4OdlIGrwQFzH/riTllGA0KjXu8+uB8xxMysPBWsOTIzrVeq5BIZ7seXkEX93Xh7v7B+JipyU+tYDXfz18Vdp+JTYfy6CgtBwfZxsGBXs2dXOahX8O7cjGZ27g9l7+qFRgrVHz7KhOrHpkoAT+QojrRvO6VC2EENcxRVHYdNyU4l95Hu6zo0IxKgr/uKEjcCGVObOwjMPnTcs0XQ/F/oSorzYutmjUKnTlRjIKdfg421JQqkerUWOr1VCqN/DOumMA/OvG4MuuK26r1XBjqDc3hnpzU4QfUz7fyfKYJAZ38uLm7n7X4iXVyW8HUwC4KcJP0tgrCXC3573J3XlieAgajYq2Mn1ICHGdkeBfCCGaicSsYs5ll6DVqIjq6GHZ3t7TgU+mRVruu9hpcba1Ir+03LIyQAcJ/oWoxkqjxs/VlnPZJZzLLiajQMeUz3ZiUBTGdm2DtZWa5NwS2rjYMnNQUL3O3b+DB4/dGMx//zzJyz/H0TPA1XJhrq62ncrifFG9Drms4rJyNhxJA2hWFySak0CP62OKlBBCXEzS/oUQopnYfMw06t+7nftl5xCbv7xuPZEJyMi/ELUxrxCx90wOD3yzlwJdOcVlBn7al8T3u03L4D03OhRbbf0L9z0+PITIdm4U6Mp5d/2xeh0bezaHe7+O4aMjGorLyuv93LXZcDSdEr2BQHd7Ilpx1XohhBD1J8G/EEI0E5vN8/1DL7/0ljmgKSg1BQ0S/AtRM/O8/7fXxpOaX0pHLwf+N7MfU/sF4mqvZXCIJxN7tL3MWWpmpVHzVEWdgP3ncut17OdbTwNQXK7ilwMpDXr+mpiXs5vQvc11V9hPCCHEpUnavxBCNAOlegM7T5uW+KvLutuBF6UXd/CS4F+ImphT8Y0KuNprWTyjD+09HRgU4smcW7td8fnD2jgBphUFisvKq1XWr8mZrCLWHkq13P9u51nuiQq64mA9r0TP5mOmi4g3d2/YBQ0hhBCtl4z8CyFEM7A3MYcSvQFvJxvCfJ0uu79/peBfraLec42FuF60q5giY6VWsXBaJO0bOUvG09EGT0drFAWOpxXW6Zgv/07AqEDvdq5YqxVOpBex43TWFbdl3eFUygxGOvk4ElqHzxEhhBDXlyYN/hcuXEhERATOzs44OzsTFRXFmjVrAEhMTESlUtV4W758ueUce/bsYfjw4bi6uuLm5sbo0aM5cOBAlec5ePAggwcPxtbWloCAAN5+++1qbVm+fDlhYWHY2trSrVs3Vq9efXVfvBBCVLK5UpX/uoz+VR75D3C3x8aq/vOVhbgejAj3YVq/QBbdHVmlkGZjCvN1BuBYav5l980pKuPHvUkAPD6sI328TEsQfrv9zBW34+d9pvNKoT8hhBA1adLg39/fn7feeouYmBj27t3LsGHDuOWWWzh8+DABAQGkpKRUuc2ePRtHR0fGjh0LQGFhIWPGjCEwMJBdu3bx999/4+TkxOjRo9Hr9QDk5+czatQo2rVrR0xMDO+88w6vv/46n332maUd27dvZ8qUKcycOZPY2FgmTpzIxIkTOXToUJO8L0KI60995vsDBLhdWKJK5vsLUTtbrYY3b+3GiM4+V+05zKPsR1MKLNsURSGnqKzavkt2naFEb6CLnzP9g9wZ7GsEYP2RVJJzSxrchjNZRew8nY1KBbf28m/weYQQQrReTTrnf8KECVXuv/nmmyxcuJCdO3fSpUsXfH19qzy+cuVKJk+ejKOjIwDx8fFkZ2fzn//8h4CAAAD+/e9/ExERwZkzZwgODmbJkiWUlZXx5ZdfYm1tTZcuXdi/fz/vv/8+Dz30EADz589nzJgxPPfccwC88cYbREdHs2DBAhYtWlRj23U6HTqdznI/P990tV+v11suPIjmw9wn0jfN2/XaTyl5pRxPK0Stgn7tXOv0+r0dtahUoCjQzt3umr1n12sftTTST9dWsJcpEyc+Jc/ynv8cm8wLPx/mn0OCeHpkCACFunK+3p4IwH0D2lFeXk4be+jX3pVdibl8uy2BZ0eFNKgNP+wyZQ4M6uiBt4OV9H0jkt+n5k/6qGWQfro66vN+NpuCfwaDgeXLl1NUVERUVFS1x2NiYti/fz8ff/yxZVtoaCgeHh4sXryYl156CYPBwOLFiwkPD6d9+/YA7NixgyFDhmBtbW05bvTo0cybN4+cnBzc3NzYsWMHTz/9dJXnGz16NKtWraq1vXPnzmX27NnVtq9fvx57e5l721xFR0c3dRNEHVxv/bQjTQVoCHRQ2L6p7q/dRasht0xFUWoCq1efvnoNrMH11kctlfTTtZFVCGBF3Lls/vhjNSoVfHFYDahZuCUBQ/pJurgp/HhaTWahGg8bBfW5WKKTTcd3sc5iFxp+3HWazuUn6v38BgWWxmgAFR3V6TJ18SqR36fmT/qoZZB+alzFxcV13rfJg/+4uDiioqIoLS3F0dGRlStX0rlz52r7mYP6AQMGWLY5OTmxadMmJk6cyBtvvAFASEgI69atw8rK9NJSU1MJCgqqci4fHx/LY25ubqSmplq2Vd4nNTWV2syaNavKBYP8/HwCAgIYNWoUzs7O9XwXxNWm1+uJjo5m5MiRaLXapm6OqMX12k9rfjgApHFzn2DGDetY9+PyD7D2cBr3jB1I5zbX5nPneu2jlkb66doq1Rt4/9BGispV9B0yHDtrDc/u/gswzef/8Ywtszp3YtuOwwB8OLUP/Tu4W/rp4YlD+fLtreSUqRgwdCSu9vXrs7+OZZC3MxY3ey3PThmBjZXUc25M8vvU/EkftQzST1eHOQO9Lhot+M/NzcXV1bXex4WGhrJ//37y8vJYsWIFM2bMYPPmzVUuAJSUlLB06VJeffXVKseWlJQwc+ZMBg4cyPfff4/BYODdd99l/Pjx7NmzBzs7u4ufrtHY2NhgY2NTbbtWq5Uf5mZM+qdluJ76qdxgZNspU5XvG8N96vW6P7yrJ+n5OgI9rn220fXURy2Z9NO1odVqae/hwOnMIk5mllCqN6A3KAS42+Fmb83BpDxe+NkU+N/Tvx2DQ6sOOLg72eHvZkdSTgknM0uI6njp32lFUTiQlEdHLwecbLWs2HcegFt7+uNoV/27iWgc8vvU/EkftQzST42rPu9lgy4Nz5s3j2XLllnuT548GQ8PD9q2bVut0v7lWFtbExwcTGRkJHPnzqV79+7Mnz+/yj4rVqyguLiY6dOnV9m+dOlSEhMT+eqrr+jTpw/9+/dn6dKlJCQk8MsvvwDg6+tLWlpalePM9801BWrb5+KaA0II0dhiz+VSUFqOq72WCH/Xeh1rq9U0SeAvhKjOXPTvWGoBfx0zFfAcFurNgim9cLIxjbX4u9nx4tiwGo8Pr8jeOZpy+RGcr7YlMvHjbfR5cwNP/hDLn/Gm1ULu7BNwxa9DCCFE69Wg4H/RokWWAnvR0dFER0ezZs0axo4dayma11BGo7FKIT0wpfzffPPNeHlVrYJdXFyMWq2usiyW+b7RaKqeGxUVxZYtW6oUQoiOjiY0NBQ3NzfLPhs3bqxy7ujo6BprDwghRGNaf9g0vWhoJy806ssv8SeEaJ7My/0dTc1n8zFTMD401JtAD3s+mtqTnoGuzL+rJw42NSddmoP/+MssF2gwKiz+OwGAUr2RVfvPU25U6B7garkAIYQQQtSkQcF/amqqJfj//fffmTx5MqNGjeL5559nz549dT7PrFmz2LJlC4mJicTFxTFr1iw2bdrEtGnTLPucPHmSLVu28MADD1Q7fuTIkeTk5PDII49w9OhRDh8+zH333YeVlRU33ngjAFOnTsXa2pqZM2dy+PBhli1bxvz586vM13/iiSdYu3Yt7733HvHx8bz++uvs3buXRx99tCFvjxBC1ImiKKytCP7HdJVMIyFaMnPg/Wd8OufzSrG2UtO/gwdgugiw8l8DiWznVuvx4TUsF1iTjUfTSM4twc1ey7KH+jOlbyDB3o48Nyq0kV6JEEKI1qpBc/7d3Nw4d+4cAQEBrF27lv/7v/8DTF9kDQZDnc+Tnp7O9OnTSUlJwcXFhYiICNatW8fIkSMt+3z55Zf4+/szatSoaseHhYXx22+/MXv2bKKiolCr1fTs2ZO1a9fSpk0bAFxcXFi/fj2PPPIIkZGReHp68tprr1mW+QMYMGAAS5cu5ZVXXuGll14iJCSEVatW0bVr14a8PUIIUSdHUvI5l12CrVbNkE5elz9ACNFshVUE77nFpkzDqA4e2Flr6ny8eeT/WFoB5QYjVpqax2e+3WFa0u/OPoH06+BBv4oLDEIIIcTlNCj4v+2225g6dSohISFkZWUxduxYAGJjYwkODq7zeRYvXnzZfebMmcOcOXNqfXzkyJFVLhbUJCIigq1bt15yn0mTJjFp0qTLtkcIIRrLusOmWiNDQrywt27yxVeEEFcg0N0eO62GEr1pEGRoaP0u6AW62+NgraGozEBCZhEhPtVT+E+mF/L3yUzUKpjWL7BR2i2EEOL60aC0/w8++IBHH32Uzp07Ex0djaOjIwApKSn861//atQGCiFEa7XukKT8C9FaqNUqOlWacz801Lvex5unDhyppejf/3aaRv2Hh/sQ4C7FPoUQQtRPg4aatFotzz77bLXtTz311BU3SAghrgenMwo5llaAlVrF8DCfyx8ghGj2wnycOHAul3Ye9gR5OtT7+PA2zuw7m8vRlAJu6VH1sUJdOStikgCYEdX+yhsrhBDiutOgkX+A7777jkGDBuHn58eZM6Yr0R9++KFliT0hhBC1M6f8R3X0wMVe1roVojW4oSLV/9aebRt0fNglKv5/8tdJCnXldPByYGCwzPMXQghRfw0K/hcuXMjTTz/N2LFjyc3NtRT5c3V15cMPP2zM9gkhRKu0rqLK/+gukvIvRGsxtqsvm58bymPDQhp0fOc25or/VYP/3QnZLNx8CoDnRoVWWeJYCCGEqKsGBf8fffQRn3/+OS+//DIazYVKtr179yYuLq7RGieEEK1RSl4J+8/lolLBqM6S8i9Ea6FSqWjn4YBG3bDgPNTXNPKflq8ju6gMgPxSPU8t24+iwB2R/ozt1qbR2iuEEOL60qDgPyEhgZ49e1bbbmNjQ1FR0RU3SgghWrPle03zdiMD3fB2tm3i1gghmgtHGyvaeZgK+ZlH/1//5TDJuSUEuNvx7wmdm7J5QgghWrgGBf9BQUHs37+/2va1a9cSHh5+pW0SQohWa29iNv/deAKAO/sENHFrhBDNTXjF6P+mY+k8snQfP8cmo1bBh3f2wMlW6oMIIYRouAZV+3/66ad55JFHKC0tRVEUdu/ezffff8/cuXP54osvGruNQgjRKmQW6nhk6T7KjQoTuvtxR6R/UzdJCNHMhLVxYu3hVD7fmgCAWgUvjQsnsp17E7dMCCFES9eg4P+BBx7Azs6OV155heLiYqZOnYqfnx/z58/nrrvuauw2CiFEi2cwKjzxQyxp+To6ejnw1m3dpGiXEKKaLn4ulv/3CnTljYldq2wTQgghGqpBwT/AtGnTmDZtGsXFxRQWFuLt7d2Y7RJCiFbl1wPJbDuZhb21hkV3R+Jg0+CPXyFEKzY01It/3NCREG9Hbu3ZFnUDiwcKIYQQF2vQt8+EhATKy8sJCQnB3t4ee3tTcZoTJ06g1Wpp3759Y7ZRCCFavN0JOQDc078dIT5OTdwaIURzpdWoeXFsWFM3QwghRCvUoIJ/9957L9u3b6+2fdeuXdx7771X2iYhhGhxTmUUEp+aX+vjh5LzAOge4HqNWiSEEEIIIcQFDQr+Y2NjGThwYLXt/fv3r3EVACGEaM1KygzcvnA7tyzYRlp+abXHdeUGy4WBbm1l7q4QQgghhLj2GhT8q1QqCgoKqm3Py8vDYDBccaOEEKK5yi/Vk1Ggq7JtV0IWucV6dOVGftmfXO2Y46mF6A0KrvZa/N3srlVThRBCCCGEsGhQ8D9kyBDmzp1bJdA3GAzMnTuXQYMGNVrjhBCiOVEUhTs/3cnw9zaRXnBhhH/riUzL/3/eVz34P5icC5hG/aXCvxBCCCGEaAoNKvg3b948hgwZQmhoKIMHDwZg69at5Ofn8+effzZqA4UQorlIzCrmaIopfT/6SBrT+rUDYMvxDMs+8akFHE3JJ7yNs2VbXJJpvr+k/AshhBBCiKbSoJH/zp07c/DgQSZPnkx6ejoFBQVMnz6d+Ph4unbt2thtFEKIZmHn6SzL/zccSQMgJa+EE+mFqFXQv4M7ACtjq47+x1UU+4vwl+BfCCGEEEI0jQYvNO3n58ecOXMasy1CCNGs7aoU/G87lUWRrpytx00p/xH+rtw7IIidp7P5ZX8yL4wJQ6NWUao3cCzVVCOlq4z8CyGEEEKIJlLn4P/gwYN07doVtVrNwYMHL7lvRETEFTdMCCGaE0VR2Hk6GwCtRkVZuZGtJzLYcsKU8j8kxJMbw7xwsdOSlq9j+6lMBod4cSy1gHKjgruDNW1dpdifEEIIIYRoGnUO/nv06EFqaire3t706NEDlUqFoijV9lOpVFLxXwjR6pzNLiY1vxStRsXk3gEs2XWWdYfT+PukaeR/SCcvbKw03BTRhiW7zvLj3iQGh3hxsCLlv6sU+xNCCCGEEE2oznP+ExIS8PLysvz/9OnTJCQkVLudPn26zk++cOFCIiIicHZ2xtnZmaioKNasWQNAYmIiKpWqxtvy5curnOfrr78mIiICW1tbvL29eeSRR6o8fvDgQQYPHoytrS0BAQG8/fbb1dqyfPlywsLCsLW1pVu3bqxevbrOr0MI0fqZ5/v3CHBlQnc/AH47cJ7cYj1ONlZ0D3AFYHLvAMtjaw+lcqii2F+EpPwLIYQQQogmVOfgv127dqhUKvR6PbNnz8ZoNNKuXbsab3Xl7+/PW2+9RUxMDHv37mXYsGHccsstHD58mICAAFJSUqrcZs+ejaOjI2PHjrWc4/333+fll1/mxRdf5PDhw2zYsIHRo0dbHs/Pz2fUqFG0a9eOmJgY3nnnHV5//XU+++wzyz7bt29nypQpzJw5k9jYWCZOnMjEiRM5dOhQnV+LEKJ121WR8t8vyIPe7dxwtddSbjRlPw0I9kCrMX2cdg9w5aEhHQB4bsUBS2aAzPcXQgghhBBNqd4F/7RaLT/99BOvvvrqFT/5hAkTqtx/8803WbhwITt37qRLly74+vpWeXzlypVMnjwZR0dHAHJycnjllVf47bffGD58uGW/yjUHlixZQllZGV9++SXW1tZ06dKF/fv38/777/PQQw8BMH/+fMaMGcNzzz0HwBtvvEF0dDQLFixg0aJFV/w6hRAtm2m+v2nkv38HD6w0aoaFevNzRVX/wSFeVfZ/bnQoMWdyiDmTQ0FpOSCV/oUQQgghRNNqULX/iRMnsmrVKp566qlGa4jBYGD58uUUFRURFRVV7fGYmBj279/Pxx9/bNkWHR2N0WgkOTmZ8PBwCgoKGDBgAO+99x4BAabU2x07djBkyBCsra0tx40ePZp58+aRk5ODm5sbO3bs4Omnn67yfKNHj2bVqlW1tlen06HT6Sz38/NNa3/r9Xr0en2D3gNx9Zj7RPqmeWuu/XQup5jzeaVYqVV083NAr9cztJOHJfgf0MG1Wps/mNSNWz7ZQU6xHncHLZ72mmb3uhqiufaRqEr6qWWQfmoZpJ+aP+mjlkH66eqoz/vZoOA/JCSE//znP2zbto3IyEgcHByqPP7444/X+VxxcXFERUVRWlqKo6MjK1eupHPnztX2W7x4MeHh4QwYMMCy7fTp0xiNRubMmcP8+fNxcXHhlVdeYeTIkRw8eBBra2tSU1MJCgqqci4fHx8AUlNTcXNzIzU11bKt8j6pqam1tnvu3LnMnj272vb169djb29f59cvrq3o6OimboKog+bWTzvTVYAGf3sjmzasB0BngLb2GtxtFOJ2bCKuhuPuDFTxxTE1oQ46Sz2T1qK59ZGomfRTyyD91DJIPzV/0kctg/RT4youLq7zvg0K/hcvXoyrqysxMTHExMRUeUylUtUr+A8NDWX//v3k5eWxYsUKZsyYwebNm6tcACgpKWHp0qXVphoYjUb0ej3//e9/GTVqFADff/89vr6+/PXXX1Xm/je2WbNmVckWyM/PJyAggFGjRuHs7HzVnlc0jF6vJzo6mpEjR6LVapu6OaIWzbWfNv18CDjPmF4dGDcyxLL91gm1HwMwDniotBxHG02rqfTfXPtIVCX91DJIP7UM0k/Nn/RRyyD9dHWYM9DrokHBf0JCguX/5uX+GvrF1tramuDgYAAiIyPZs2cP8+fP59NPP7Xss2LFCoqLi5k+fXqVY9u0aQNQ5UKBl5cXnp6enD17FgBfX1/S0tKqHGe+b64pUNs+F9ccqMzGxgYbG5tq27VarfwwN2PSPy1Dc+qnQl05W46bivZFBXvVu13uzeR1NLbm1EeidtJPLYP0U8sg/dT8SR+1DNJPjas+72Wdq/1fbPHixXTt2hVbW1tsbW3p2rUrX3zxRUNPZ2E0GqvMpTc/180332xZatBs4MCBABw7dsyyLTs7m8zMTMuqA1FRUWzZsqXKXIjo6GhCQ0Nxc3Oz7LNx48Yq546Ojq6x9oAQ4vry8V8nySoqo72HPVEdPJq6OUIIIYQQQjRIg4L/1157jSeeeIIJEyawfPlyli9fzoQJE3jqqad47bXX6nyeWbNmsWXLFhITE4mLi2PWrFls2rSJadOmWfY5efIkW7Zs4YEHHqh2fKdOnbjlllt44okn2L59O4cOHWLGjBmEhYVx4403AjB16lSsra2ZOXMmhw8fZtmyZcyfP79Kyv4TTzzB2rVree+994iPj+f1119n7969PProow15e4QQrcTZrGIWbzVlOr08vjPWVg2+XiqEEEIIIUSTalDa/8KFC/n888+ZMmWKZdvNN99MREQEjz32GP/5z3/qdJ709HSmT59OSkoKLi4uREREsG7dOkaOHGnZ58svv8Tf398yp/9i3377LU899RTjx49HrVZzww03sHbtWkv6g4uLC+vXr+eRRx4hMjIST09PXnvtNcsyfwADBgxg6dKlvPLKK7z00kuEhISwatUqunbt2pC3RwjRSry5+ghlBiODQzwZEe7d1M0RQgghhBCiwRoU/Ov1enr37l1te2RkJOXl5XU+z+LFiy+7z5w5c5gzZ06tjzs7O7N48eJLnisiIoKtW7de8nkmTZrEpEmTLtseIcT1YcepLNYdTkOjVvHqTZ1bTcE+IYQQQghxfWpQDus999zDwoULq23/7LPPqqTsCyFES/X51tMATOkbQCcfpyZujRBCCCGEEFemQSP/YBq1X79+Pf379wdg165dnD17lunTp1eZT//+++9feSuFEOIaSskrYdOxdADuHxjUxK0RQgghhBDiyjUo+D906BC9evUC4NSpUwB4enri6enJoUOHLPtJmqwQoiX6cU8SRgX6BbnTwcuxqZsjhBBCCCHEFWtQ8P/XX381djuEEKJZMBgVlu05C8DUfoFN3BohhBBCCCEah6xbJYQQlWw5kcH5vFJc7bWM7uLb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1KnQaDS19+QTERFJhHv+iYiIjMyqVatw+fJl+Pn54f333wcAxMfHVxlXWFiIzz77DNu2bUNeXh5GjBiBF154Afb29ti3bx+uXr2KkSNHIigoCGPGjAEAhISEICEhAdu2bUOTJk2wZ88eDBw4EHFxcWjZsiWmTZsGjUaDn3/+GdbW1khISIBarYabmxt27dqFkSNH4tKlS7C1tYWlpSUAoKCgAGFhYfD390d+fj4WLVqEF154ATExMVAq/9iPsXjxYnz66adwd3fHpEmT8NJLL8HGxgarVq2ClZUVRo8ejUWLFuHzzz/X3+fw4cOwsLDA0aNHkZycjIkTJ6JBgwZYunRpbUZARERU59j8ExERGRk7OzuYmZnByspKf6j/xYsXq4wrLS3F559/jhYtWgAARo0ahW+++Qa3b9+GWq2Gr68vevfujZ9++gljxozB9evX8dVXX+H69eto0qQJAGDWrFk4cOAAvvrqKyxbtgzXr1/HyJEj0bZtWwBA8+bN9X/P0dERANCoUSPY29vrl48cObJSXZs2bYKTkxMSEhLg5+enXz5r1iwEBwcDAN555x2MHTsWhw8fRlBQEADgtddew+bNmyuty8zMDJs2bYKVlRXatGmD999/H7Nnz8bf//73ShsWiIiI5I6fakRERFQtKysrfeMPAM7OzvD09IRara60LCMjAwAQFxcHrVYLb29vqNVq/c+xY8f0h+m//fbb+OCDDxAUFITFixfj3Llzj60jMTERY8eORfPmzWFrawtPT08AwPXr1yuN8/f3r1QXAP1Ghj/XWqFdu3awsrLS/x4YGIj8/HykpqY+ti4iIiI54Z5/IiIiqpapqWml3xUKRbXLdDodACA/Px8qlQrR0dFQqVSVxlVsMJg8eTKCg4MRERGBQ4cOYfny5VixYgWmT5/+0DqGDh0KDw8PrF+/Hk2aNIFOp4Ofn1+Vc/MfrE2hUFS7rKJWIiIiY8M9/0REREbIzMys0kR9T0NAQAC0Wi0yMjLg5eVV6efBKwm4ublh6tSp2L17N2bOnIn169frawJQqa67d+/i0qVLWLBgAfr27QsfHx/cu3fvqdUcGxuLoqIi/e8nT57Uz0FARERUn7D5JyIiMkKenp74/fffkZycjDt37jyVPeLe3t54+eWXMW7cOOzevRvXrl3DqVOnsHz5ckRERAAAQkNDcfDgQVy7dg1nzpzBTz/9BB8fHwCAh4cHFAoF9u7di8zMTOTn58PBwQENGjTAl19+iStXruDIkSMICwv7n2utoNFo8NprryEhIQH79u3D4sWLERISwvP9iYio3uEnGxERkRGaNWsWVCoVfH194eTkVOX8+b/qq6++wrhx4zBz5ky0atUKw4cPR1RUFNzd3QGU79WfNm0afHx8MHDgQHh7e2Pt2rUAgKZNm2LJkiWYN28enJ2d9U34tm3bEB0dDT8/P8yYMQP/+Mc/nkqtANC3b1+0bNkSPXr0wJgxY/D888/jvffee2rrJyIiMhQKIYSQuggiIiKiujZhwgRkZ2fju+++k7oUIiKiWsc9/0RERERERET1HJt/IiIiIiIionqOh/0TERERERER1XPc809ERERERERUz7H5JyIiIiIiIqrn2PwTERERERER1XNs/omIiIiIiIjqOTb/RERERERERPUcm38iIiIiIiKieo7NPxEREREREVE9x+afiIiIiIiIqJ77f3BAkvqsqfb6AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(12,3))\n",
    "\n",
    "ax.set_title(\"Timeseries Plot\")\n",
    "sns.lineplot(data=df, x='timestamp', y='prices', ax=ax)\n",
    "\n",
    "plt.xticks(rotation = 45)\n",
    "plt.grid(True)\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
